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
это как (первое и условие) ИЛИ (второе и условие) → условие & (первое или второе)