JPA найти несколько элементов по выбору - PullRequest
0 голосов
/ 09 января 2019

Я ищу простое решение уродливой проблемы. Я использую Spring Data JPA и у меня есть 7 объектов, которые все связаны. У меня есть необходимость сделать findByEntity1_NameAndEntity2_NameAndEntity3_NameAndEntity4_NameAndEntity5_NameAndEntity6_NameAndEntity7_Name

Мне нужны все перестановки, включая и исключая друг друга. Я мог бы построить все 128 методов и использовать большой регистр, чтобы выбрать, какой использовать, но это ужасно уродливо. Я чувствую, что мне не хватает легкой кнопки на этом.

1 Ответ

0 голосов
/ 09 января 2019

Метод запроса по примеру

Я думаю, что лучшим вариантом для вас является использование (imo, довольно редко используется) QueryByExample функции Spring Data JPA. Исследуя этот ответ, я разместил ответ где-то еще , который нуждался в таком же ответе. Я бы взглянул на это, чтобы понять, как это решает вашу проблему.

Сначала вам нужно будет QueryByExampleExecutor на Repository. Во-вторых, вам просто нужно создать свой запрос следующим образом (и, надеюсь, вы используете беглых компоновщиков для ваших сущностей!):

ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreNullValues();
Example<MyObject> exampleQuery = Example.of(new MyObject()
    .withEntity1(new Entity1().withName("foo"), matcher);
repository.findAll(exampleQuery);

Выберет все элементы MyObject с Entity1, имеющие name из foo.

ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreNullValues();
Example<MyObject> exampleQuery = Example.of(new MyObject()
    .withEntity1(new Entity1().withName("foo"),
    .withEntity2(new Entity2().withName("bar"),
    .withEntity3(new Entity3().withName("baz"),
    .withEntity4(new Entity4().withName("foo"),
    .withEntity5(new Entity5().withName("bar"),
    .withEntity6(new Entity6().withName("baz"),
    .withEntity7(new Entity7().withName("foo")
), matcher);
repository.findAll(exampleQuery);

Выберет все элементы MyObject для Entity1 с name из foo, Entity2, с name из bar и т. Д.

...