Spring Запрос данных JPA "OR"

Я использую Spring Data JPA и пытаюсь добавить запрос в мой репозиторий. Я пытался просто создать запрос без аннотации @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 ?

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

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

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

Спасибо.

EDIT:

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

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

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

Ответ 1

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

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

In и NotIn также принимают любой подкласс Collection как параметр как массивы или varargs. Для других синтаксических версий того же логический оператор проверяет ключевые слова запроса репозитория.

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

Ссылка: Таблица 4. Поддерживаемые ключевые слова внутри имен методов в Создание запроса docs

Ответ 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, чтобы быть очень конкретным и не рискуем смешать ваш AND/OR с именем метода.