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);
}
Другие вопросы по тегам