#jpa
Вопрос:
у меня есть простая JpaRespository, где я должен использовать некоторые методы с именем spring
это выглядит так
select * from a where a.user_id in ( some id values)
в jpa тот же запрос будет выглядеть так
List<A> findAllByUserIdIn(List<Long>ids)
и его работа довольно хороша
и что мне нужно знать ?как создать один и тот же запрос в методе именования spring
в sql это выглядит так
select * from a where a.user_id in ( some values...) and ( a.created_at <='some date" or a.updated_at<='some date)
я пытался сделать что-то вроде этого
List<A> findAllByUserIdInAndCreatedAtLessThanEqualOrUpdatedAtLessThanEqual(List<Long>ids,TimeStamp created_at,TimeStamp updated_at)
но это работает неправильно — он выдает мне все записи с обновлениями меньше этой даты, но их нет в текущем списке идентификаторов пользователей, и я знаю, почему — потому что его значение OrUpdatedAtLessThanEqual,
если я это сделаю, и значение AndUpdatedAtLessThanEqual тоже работает неправильно
итак, есть ли какой-либо способ сделать то, что мне нужно, без создания собственного запроса
Комментарии:
1. Вы не можете, вы не можете определить приоритет оператора. И даже если бы это было возможно, использование сложных имен методов не рекомендуется. Просто используйте
@Query
аннотацию.
Ответ №1:
То, что вы написали findAllByUserIdInAndCreatedAtLessThanEqualOrUpdatedAtLessThanEqual
, верно, но если вы внимательно посмотрите в своем собственном запросе, вы найдете скобки, которые группируют условия.
Requirement - condition1 AND (condition2 OR condition3)
Your method name - condition1 AND condition2 OR condition3
Поскольку нет функции для размещения сгруппированных условий, вам придется использовать @Query
аннотации.
Аннотация @Query не только уменьшает головные боли, связанные с невозможностью чтения длинных имен методов JPA, но также исключает использование соединений (поскольку вы будете использовать имена параметров, используемые в сущности, вместо имен столбцов в таблице), что, в свою очередь, улучшает читаемость и уменьшает использование собственных запросов.