Spring data jpa - Как объединить несколько А и Или через имя метода
Я пытаюсь перенести приложение. Я работаю над Hibernate для Spring Data Jpa.
Хотя весенние данные jpa предлагают простые методы построения запросов, я застрял в создании метода запросов, который использует оба And
а также Or operator
,
MethodName - findByPlan_PlanTypeInAndSetupStepIsNullOrStepupStepIs(...)
Когда он преобразуется в запрос, первые два выражения объединяются и выполняются как [(exp1 and exp2) or (exp3)]
,
тогда как требуется ](exp1) and (exp2 or exp3)]
,
Может кто-нибудь, пожалуйста, дайте мне знать, если это достижимо через Spring data jpa?
4 ответа
Согласитесь с Оливером в отношении длинных и нечитаемых имен методов, но тем не менее и ради аргумента вы можете достичь желаемого результата, используя эквивалентность
A /\ (B \/ C) <=> (A /\ B) \/ (A /\ C)
A and (B or C) <=> (A and B) or (A and C)
Так что в вашем случае это должно выглядеть примерно так: findByPlan_PlanTypeInAndSetupStepIsNullOrPlan_PlanTypeInAndStepupStepIs(...)
В настоящее время это невозможно, а также не будет в будущем. Я бы сказал, что даже если бы это было возможно, при более сложном запросе вы не захотели бы искусственно втискивать всю сложность запроса в имя метода. Не только потому, что становится трудно усвоить то, что на самом деле происходит в запросе, но и с точки зрения клиентского кода: вы хотите использовать выразительные имена методов, которые - в случае простого findByUsername(…)
- вывод запроса позволяет создавать.
Для более сложных вещей вы просто повышаете сложность запроса в вызывающем коде, и желательно вместо этого перейти к читаемому имени метода, которое семантически выражает то, что делает запрос, и сохранить сложность запроса в объявленном вручную запросе либо с использованием @Query
именованные запросы или тому подобное.
Используйте что-то вроде
findByFirstElementAndCriteriaOrSecondElementAndCriteria
это как (первое и условие) ИЛИ (второе и условие) -> условие & (первое или второе)
Вариант 1. Вы можете использовать именованные запросы (см. Использование именованных запросов JPA):
@Entity
@NamedQuery(name = "User.findByEmailAddress",
query = "select u from User u where u.emailAddress = ?1")
public class User {
}
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmailAddress(String emailAddress);
}
Вариант 2: использовать @Query
написать свои собственные запросы (см. Использование @Query)
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
}