2012-04-23 6 views
10

스프링 데이터 JPA를 사용 중이고 리포지토리에 쿼리를 추가하려고합니다. 난 그냥 같은 @query 주석없이 쿼리를 구축을 위해 노력 하였다스프링 JPA 데이터 "OR"쿼리

List<Item> findByTypeAndStateOrStateAndStartDateBetween(Type type, State s, State s2, Date startDate, Date endDate); 

내 목표는과 같이 쿼리를 작성하는 것입니다

select * from item where type = ? and (state = ? or state = ?) and start_date between ? and ? 

내 문제는 OR 절입니다. 괄호가 있는지 확인하는 방법이 있습니까? 그렇지 않으면 논리가 올바르지 않습니다. 여기에있는 예제는 다음과 같습니다. http://static.springsource.org/spring-data/data-jpa/docs/1.0.0.M1/reference/html/#jpa.query-methods.query-creation

하나 이상의 절이있는 절이 없습니다.

또한 개체 목록을 전달하는 방법이 있습니까? 예를 들어 3 개 주에서 항목을 찾으려면 다른 쿼리를 만들어야하는데, 그렇지 않은 쿼리는 잘 작성되지 않습니다.

감사합니다.

편집 : 나는 @query 표기법을 사용하여 상태 목록으로 전달하는 방법을 알아 냈

. 그렇게하면 다음과 같이됩니다.

@Query("FROM item i WHERE i.type = ?1 AND i.state IN (?2)") 

그러면 두 번째 매개 변수로 메서드에 목록을 전달할 수 있습니다. 아직 @Query 표기법을 사용하지 않고이 작업을 수행하는 방법을 알지 못합니다.

+3

나는 봄 데이터 쿼리를 지정할 수 있습니다 이유는 생각에, 그것은 단지 당신이 혼자 메소드 이름에서 원하는 것을 결정까지 갈 수 있습니다. 단순한 쿼리에서는 문제가 없지만 복잡성을 높이면 추측하기보다는 원하는 것을 정확하게 전달하는 것이 더 낫습니다. – Thevenin

+0

@Query는 긴 메서드 이름보다 훨씬 읽기 쉽습니다. – skel625

+0

고마워, 이것 역시 내가 온 결론이다. @Query를 사용하십시오. – devo

답변

1

글쎄, 당신은 매우 가깝습니다.

List<Item> findByTypeAndStateInAndStartDateBetween(Type type, Collection<State> states, Date startDate, Date endDate); 

에서와 NotIn는 매개 변수로 컬렉션의 서브 클래스를 취할 다음 In 또는 IsIn 키워드 (키워드는 질문이 요청 된 시점에 지원하고 있는지 확실하지) 사용할 수 있습니다 @Query없이이 작업을 수행하려면 배열 또는 varargs로도 . 논리 연산자의 다른 구문 버전은 Repository query keywords입니다.

이렇게하면 OR 조건에 대해 여러 상태를 전달할 필요가 있습니다.

참조 : 표 메소드 이름 내부 4. 지원되는 키워드를 Query creation 문서

+0

감사합니다. 이 질문을 할 때 이러한 키워드를 사용할 수 없었습니다. – devo

2

특정 방송국의 모든 데이터를 가져 오는 것과 동일한 일을하고 싶었습니다. 두 방송국 사이의 데이터입니다.

findByStartdateBetweenOrEnddateBetweenAndStation(start,end,start,end,station) 
Gives you ==> 
SELECT...WHERE (startdate between start,end) OR (enddatebetween start,end AND station=station) 

그리고 :

SELECT...WHERE station=station AND (startdate between start,end OR enddatebetween start,end) 

@query 사용이 매우 구체적으로 그리고 기회는 당신의 AND/OR와 혼합하지 않습니다

findByStationAndStartdateBetweenOrEnddateBetween(station, start,end,start,end) 
Gives you ==> 
SELECT...WHERE (station=station AND startdate between start,end) OR enddatebetween start,end 

모두 내가 원하는대로 잘못 메소드 명

관련 문제