Spring data jpa - Как объединить несколько имени метода And и or through

Я пытаюсь перенести приложение. Я работаю от Hibernate до Spring данных Jpa.

Хотя Spring данные jpa предлагает простые методы построения запросов, я застрял в создании метода запроса, который использует как And, так и Or operator.

Имя метода - findByPlan_PlanTypeInAndSetupStepIsNullOrStepupStepIs(...)

Когда он преобразуется в запрос, первые два выражения объединяются и выполняются как [(exp1 and exp2) or (exp3)].

тогда как требуется ](exp1) and (exp2 or exp3)].

Может кто-нибудь, пожалуйста, сообщите мне, возможно ли это через Spring data jpa?

Ответ 1

Согласитесь с Оливером в отношении длинных и нечитаемых имен методов, но, тем не менее, и ради аргумента, вы можете достичь желаемого результата, используя эквивалентность

A /\ (B \/ C) <=> (A /\ B) \/ (A /\ C)
A and (B or C) <=> (A and B) or (A and C)

Так что в вашем случае это должно выглядеть примерно так:

findByPlan_PlanTypeInAndSetupStepIsNullOrPlan_PlanTypeInAndStepupStepIs(...)

Ответ 2

Вариант 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);
}

Ответ 3

В настоящее время это невозможно, а также не будет в будущем. Я бы сказал, что даже если это было возможно, с более сложным запросом вы бы не хотели искусственно сжать всю сложность запроса в имя метода. Не только потому, что трудно усвоить, что происходит в запросе, но и с точки зрения клиентского кода: вы хотите использовать выражения экспрессивных методов, которые - в случае простого findByUsername(…) - вывод запроса позволяет вам создать.

Для более сложных вещей вы просто повышаете сложность запроса в вызывающем коде, и желательно переходить к читаемому имени метода, которое семантически выражает то, что делает запрос, и сохраняет сложность запроса в объявленном вручную запросе либо с помощью @Query, именованные запросы или тому подобное.

Ответ 4

Используйте что-то вроде

findByFirstElementAndCriteriaOrSecondElementAndCriteria

это как (первое и условие) ИЛИ (второе и условие) → условие & (первое или второе)