@Query in Hibernate를 사용한 파라미터 네이티브 쿼리
MariaDb 10.3에 대해 @Query 메서드를 파라미터화하려고 합니다.F0001
이 튜토리얼의 섹션 5.2에는 다음 예가 있습니다.
5.2 네이티브쿼리의 네이티브인덱스 파라미터는 JPQL과 동일하게 동작합니다.
@Query(
value = "SELECT * FROM Users u WHERE u.status = ?1",
nativeQuery = true)
User findUserByStatusNative(Integer status);
그러나 동일한 작업을 수행하려고 하면(시퀀스를 사용하여)
@Query(value = "SELECT NEXTVAL(?1)", nativeQuery = true)
Long getNextSequenceByFleetId(String fleetId);
DB에서 시퀀스가 올바르게 설정되어 있지만, 나에게는 동작하지 않습니다.
SELECT NEXTVAL(F0001) --> returns nextval 2
내가 뭘 놓쳤지?
감사합니다.
PS: 이 게시물을 봤는데 예시는 이 게시물을 사용하지 않았습니다.@Query
주석입니다.
갱신:
코멘트의 @JB Nizet의 제안에 따라 SpEL을 사용해 보았습니다.
https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions
@Query("select u from User u where u.age = ?#{[0]}")
List<User> findUsersByAge(int age);
다음을 시도했습니다.
@Query(value = "SELECT NEXTVAL(?#{[0]})", nativeQuery = true)
Long getNextSequenceByFleetId(String fleetId);
하지만 아아...
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''F0001')' at line 1
JB니젯이 정답을 맞혔어요.
값을 파라미터로 쿼리에 전달할 수 있습니다.단, 테이블, 열 또는 시퀀스 이름은 사용할 수 없습니다.데이터베이스에서는 쿼리 계획을 준비하기 위해 이 정보가 필요합니다.
유감스럽게도 SpEL을 사용한 "꼼수"는 효과가 없습니다.SPEL은 바인드 파라미터로 변환되므로 동일한 제약조건이 적용됩니다.규칙에는 1개의 예외가 있습니다.SpEL 식에서 엔티티 이름만 사용하는 경우입니다.이 예에서는 스프링 데이터 JPA 통합 테스트에서 가져옵니다.
@Query("update #{#entityName} u set u.active = :activeState where u.id in :ids")
void updateUserActiveState(@Param("activeState") boolean activeState, @Param("ids") Integer... ids);
이는 여러 리포지토리에 대해 상속되는 인터페이스에서 사용하기 위한 것으로, 실제로 도움이 되지 않을 수 있습니다.
저장 프로시저를 호출하면 파라미터에 따라 시퀀스에 대한 쿼리를 실행할 수 있습니다.
언급URL : https://stackoverflow.com/questions/52380496/native-query-with-parameters-using-query-in-hibernate
'programing' 카테고리의 다른 글
ClassLoader.getResources()를 올바르게 사용하는 방법 (0) | 2022.09.27 |
---|---|
HTML과 Java를 효율적으로 해석하려면 어떻게 해야 하나요? (0) | 2022.09.27 |
Python virtualenv를 종료/종료/비활성화하는 방법 (0) | 2022.09.27 |
서로 다른 두 서버의 두 MySQL 데이터베이스 간 통신 설정 (0) | 2022.09.27 |
LAMP 설치에서 MySQL을 MariaDb로 변경하는 방법 (0) | 2022.09.27 |