복붙노트

[SPRING] 작은 따옴표로 쿼리 매개 변수를 설정하는 방법

SPRING

작은 따옴표로 쿼리 매개 변수를 설정하는 방법

오라클 데이터베이스를 사용하고 있습니다 .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);

어떤 생각?

해결법

  1. ==============================

    1.:를 작은 따옴표 사이에 넣으므로 이름 [to]가있는 매개 변수가 없습니다. ': to'대신에 :를 사용하십시오.

    :를 작은 따옴표 사이에 넣으므로 이름 [to]가있는 매개 변수가 없습니다. ': to'대신에 :를 사용하십시오.

    즉, 이것은 어쨌든 작동하지 않습니다. 나는 정말로 비슷한 문제에 직면했고 몇 시간이 지난 후에 내가 여기서 답을 제시하는 해결책을 찾았습니다. 어떤 이유로, 간격이 생기면 매개 변수 주입이 예상대로 작동하지 않습니다.

    위의 링크에서 결론을 고려 -이 작동합니다 믿습니다 :

    @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. ==============================

    2.: ps 및 다른 모든 매개 변수를? 1,? 2, ...로 바꾸고 메서드 매개 변수를 SQL 매개 변수와 일치 시키십시오 (순서가 중요 함).

    : ps 및 다른 모든 매개 변수를? 1,? 2, ...로 바꾸고 메서드 매개 변수를 SQL 매개 변수와 일치 시키십시오 (순서가 중요 함).

  3. ==============================

    3.

    readytoprocessat= (CURRENT_TIMESTAMP+ interval ':to' second)
    

    이 절에는 문제가 있으며 이전에 한 줄씩 개별적으로 수행하십시오. 그러면 스스로 문제를 볼 수 있습니다.

  4. ==============================

    4.나는이 문제에 대한 해답을 발견했다.

    나는이 문제에 대한 해답을 발견했다.

    @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);
    
  5. from https://stackoverflow.com/questions/30342298/how-to-set-query-parameters-with-single-quotes by cc-by-sa and MIT license