programing

@Query in Hibernate를 사용한 파라미터 네이티브 쿼리

newsource 2022. 9. 27. 23:56

@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