【问题标题】:How to set query parameters with single quotes如何使用单引号设置查询参数
【发布时间】:2015-08-01 06:22:08
【问题描述】:

我正在使用 oracle 数据库。我需要通过 jpa 存储库运行更新查询。这是我尝试执行的查询。

            @Transactional(propagation = Propagation.REQUIRES_NEW)
            @Modifying
            @Query(
                value = "UPDATE transactionlog SET transactionstatus= :ps,startedat = CURRENT_TIMESTAMP, readytoprocessat= (CURRENT_TIMESTAMP+ interval ':to' second)  WHERE logid IN (:li) ",
                nativeQuery = true)
            public Integer reserve(@Param("ps") short processingStatus, @Param("li") List<Integer> logIdList, @Param("to") int timeOut);

但是这个例外

org.springframework.dao.InvalidDataAccessApiUsageException: Parameter with that name [to] did not exist; nested exception is java.lang.IllegalArgumentException: Parameter with that name [to] did not exist

但是如果我如下改变这个方法,它就可以正常工作。

@Transactional(propagation = Propagation.REQUIRES_NEW)
            @Modifying
            @Query(
                value = "UPDATE transactionlog SET transactionstatus= :ps,startedat = CURRENT_TIMESTAMP, readytoprocessat= (CURRENT_TIMESTAMP+ interval '5' second)  WHERE logid IN (:li) ",
                nativeQuery = true)
            public Integer reserve(@Param("ps") short processingStatus, @Param("li") List<Integer> logIdList);

有什么想法吗?

【问题讨论】:

    标签: java spring oracle11g spring-data-jpa


    【解决方案1】:

    名称为[to] 的参数不存在,因为您将:to 放在单引号之间。使用:to 而不是':to'

    话虽如此,这无论如何都行不通。我遇到了非常相似的问题,几个小时后终于找到了我提出的解决方案in answer here。出于某种原因,当interval 发挥作用时,参数注入不会像您预期的那样起作用。

    考虑到上面链接的结论 - 我相信这应该可行:

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Modifying
    @Query(value = "UPDATE transactionlog SET transactionstatus= :ps,
           startedat = CURRENT_TIMESTAMP, 
           readytoprocessat= (CURRENT_TIMESTAMP + (( :to ) || 'second')\\:\\:interval)
           WHERE logid IN (:li) ",nativeQuery = true)
    public Integer reserve(@Param("ps") short processingStatus, @Param("li") List<Integer> logIdList, @Param("to") int timeOut);
    

    【讨论】:

      【解决方案2】:

      将 :ps 和所有其他参数替换为 ?1, ?2, ... 并使 methos 参数匹配 SQL 参数(顺序很重要)。

      【讨论】:

        【解决方案3】:

        我已经找到了这个问题的答案。

        @Transactional(propagation = Propagation.REQUIRES_NEW)
                @Modifying
                @Query(
                    value = "UPDATE transactionlog SET transactionstatus= :ps,startedat = CURRENT_TIMESTAMP, readytoprocessat= CURRENT_TIMESTAMP+ NUMTODSINTERVAL( :to, 'SECOND' )  WHERE logid IN (:li) ",
                    nativeQuery = true)
                public Integer reserve(@Param("ps") short processingStatus, @Param("li") List<Integer> logIdList, @Param("to") int timeOut);
        

        【讨论】:

          【解决方案4】:
          readytoprocessat= (CURRENT_TIMESTAMP+ interval ':to' second)
          

          此子句有问题,请尝试单独执行前一行。这样你就可以自己看到问题了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-01-27
            • 2018-09-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多