[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.:를 작은 따옴표 사이에 넣으므로 이름 [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.: ps 및 다른 모든 매개 변수를? 1,? 2, ...로 바꾸고 메서드 매개 변수를 SQL 매개 변수와 일치 시키십시오 (순서가 중요 함).
: ps 및 다른 모든 매개 변수를? 1,? 2, ...로 바꾸고 메서드 매개 변수를 SQL 매개 변수와 일치 시키십시오 (순서가 중요 함).
-
==============================
3.
readytoprocessat= (CURRENT_TIMESTAMP+ interval ':to' second)
이 절에는 문제가 있으며 이전에 한 줄씩 개별적으로 수행하십시오. 그러면 스스로 문제를 볼 수 있습니다.
-
==============================
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);
from https://stackoverflow.com/questions/30342298/how-to-set-query-parameters-with-single-quotes by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] SQL 스크립트에서 다른 SQL 파일을 참조 할 수 있습니다. (0) | 2019.05.19 |
---|---|
[SPRING] Spring Batch를 이용한 복잡한 XML; StaxEventItemWriter; Jaxb2Marshaller (0) | 2019.05.19 |
[SPRING] 스프링 보안 j_spring_security 로그 아웃 문제 (0) | 2019.05.19 |
[SPRING] Axiom과 Spring WS : JAXB가 MTOM 첨부 파일을 인라인합니다. (0) | 2019.05.19 |
[SPRING] AspectJ aspect 위에 Spring @Cacheable 작업을 만드는 방법은? (0) | 2019.05.19 |