2012-04-23 5 views
10

Я использую Spring Data JPA и пытаюсь добавить запрос в мой репозиторий. Я пытался просто построить запрос без аннотации @Query как:Spring JPA Data «OR» query

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 ? 

Моя проблема с ИЛИ п. Есть ли способ убедиться, что есть скобки? В противном случае логика неверна. Примеры, которые я нашел здесь: http://static.springsource.org/spring-data/data-jpa/docs/1.0.0.M1/reference/html/#jpa.query-methods.query-creation

не имеют каких-либо или предложений с более чем одной колонкой.

Кроме того, есть ли способ передать список объектов. Например, если бы я хотел найти элементы с тремя состояниями, мне пришлось бы создать еще один запрос, который не очень хорошо масштабируется.

Спасибо.

EDIT:

Я понял, как перейти из списка состояний, используя обозначение @Query. Вы делаете это так:

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

Затем вы можете просто передать список методу в качестве второго параметра. Все еще не знаю, как это сделать, не используя нотацию @Query.

+3

Я думаю, именно поэтому Spring Data позволяет указать запрос, он может идти только до сих пор в определении того, что вы хотите от имени метода в одиночку. Это нормально для простых запросов, но как только вы увеличите сложность, вам лучше сказать, что именно вы хотите, а не гадать. – Thevenin

+0

Плюс @Query гораздо легче читать, чем длинное имя метода. – skel625

+0

Спасибо, это вывод, к которому я пришел. Просто используйте @Query. – devo

ответ

1

Ну, вы очень близко. Для того, чтобы сделать это без @QueryIn или IsIn можно использовать ключевое слово (не уверен, были ли поддерживаются эти ключевые слова в то время вопрос был задан):

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

В и NotIn также принимать какие-либо подкласс сбора в качестве параметра а также как массивы или varargs. Для других синтаксических версий того же проверка логического оператора Repository query keywords.

Этого будет достаточно для передачи любого количества состояний для критериев ИЛИ.

Ссылка: Таблица 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) 

И:

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

Оба неверны, как я хотел:

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

Используйте @Query быть очень конкретным и не рискуйте смешивания ваш И/ИЛИ с имя метода.

Смежные вопросы