Сущность запроса, содержащая свойство типа ArrayList <String>, содержащее определенный c набор строк с использованием данных Spring jpa - PullRequest
1 голос
/ 10 июля 2020

Это, я думаю, глупый вопрос, но я на несколько дней застрял на нем. У меня есть объект со свойством List of strings, как показано ниже:

   public class DummyEntity {
        @Id
        @GeneratedValue
        private Long id;
        private String name;
        @ElementCollection
        private List<String> items;
    }

Я использую Spring Data JPA и wi sh для запроса этого объекта и извлечения из объектов базы данных, которые имеют точный набор элементов в этом списке массива. Это означает, что если у меня есть в моей базе данных:

DummyEntity (1, "name1", ["first"])
DummyEntity (1, "name1", ["first", "second"])
DummyEntity (1, "name1", ["first", , "second", "third"])

мне нужен запрос, в котором я передаю то есть [«первый», «второй»] (порядок строк не имеет значения), и я получаю только DummyEntity (1, «name1», [«первый», «второй»]). Я знаю, что могу сделать это с помощью java, но я бы ненавидел это как работу.

Я сделал для цели вопроса: демонстрационный проект github где у меня минимальный проект с провальным тестом, который мне нужен для успеха. Я пробовал следующее:

Page<DummyEntity> findAllByItemsIn(Pageable pageable,List<String> items);
Page<DummyEntity> findAllByItemsContains(Pageable pageable,List<String> items);
Page<DummyEntity> findAllByItemsEquals(Pageable pageable,List<String> items);
Page<DummyEntity> findAllByItems(Pageable pageable,List<String> items);  

Ответы [ 2 ]

2 голосов
/ 10 июля 2020
    @Query("Select d from DummyEntity d left join d.items i where i in :items " +
            "group by d having count(i) = :itemsSize")
    Page<DummyEntity> findAllByItems(List<String> items, 
                                     long itemsSize, 
                                     Pageable pageable);
0 голосов
/ 10 июля 2020

Вот еще один способ сделать это.

DummyEntity findOne(Example<DummyEntity> example); //repository

И в вашем сервисе вы можете вызвать его следующим образом:

DummyEntity entity = new DummyEntity(List.of("first","second");
DummyEntity fromDb = repository.findOne(Example.of(entity));
...