Как я могу использовать метод findBy с несколькими или (|) и (& amp;) операторами? [Дубликат]

Если вы хотите отправить ICMP-пакеты в php, вы можете взглянуть на эту реализацию PHP-протокола Native-PHP ICMP , но я ее не тестировал.

12
задан Alankar More 4 March 2016 в 08:17
поделиться

4 ответа

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

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

. Поэтому в вашем случае это должно выглядеть примерно так: this: findByPlan_PlanTypeInAndSetupStepIsNullOrPlan_PlanTypeInAndStepupStepIs (...)

9
ответ дан Damir Djordjev 18 August 2018 в 01:34
поделиться
  • 1
    Это работало в основном - однако: как избежать дублирования переменных с помощью подхода? (если возможно вообще ....) – Trinimon 13 July 2017 в 08:38
  • 2
    да, это работает ... Похоже, вы не можете избежать дублирования параметров. Я использовал метод фасада, чтобы скрыть неудобную сигнатуру метода – kiedysktos 7 August 2017 в 11:45

Вариант 1: вы можете использовать именованные запросы (см. Использование JPA Named Queries ):

@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
ответ дан fateddy 18 August 2018 в 01:34
поделиться
  • 1
    Спасибо за ответ! Единственным недостатком использования NamedQuery или Query является то, что класс выглядит таким грязным, когда в одном классе репо есть несколько запросов на соединение :( – Preethi Ramanujam 7 March 2016 в 07:02
  • 2
    Но опять же, не будут ли ваши названия методов запутаться и стать трудными для чтения? Вывод запроса из имени метода удобен для простых запросов - в какой-то момент вам следует переключиться на @Query или тому подобное. – fateddy 7 March 2016 в 10:23

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

findByFirstElementAndCriteriaOrSecondElementAndCriteria

как (первое условие) ИЛИ (второе и условие) -> условие & amp; (первый или второй)

0
ответ дан leonardo rey 18 August 2018 в 01:34
поделиться
  • 1
    Он будет работать, но самым большим недостатком этого является то, что вы должны передавать в качестве аргумента одни и те же критерии столько раз, сколько вы используете их в запросе. В этом случае вам придется передать две переменные Criteria, содержащие один и тот же контент: findByFirstElementAndCriteriaOrSecondElementAndCriteria(Element element1, Criteria criteria1, Element element2, Criteria criteria2) //criteria1.equals(criteria2) -> true – thorinkor 13 June 2018 в 08:25

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

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

3
ответ дан Oliver Gierke 18 August 2018 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: