使用spring数据jpa包含类型为ArrayList <String>的属性的查询实体,该属性包含一组特定的字符串

时间:2020-07-10 07:16:30

标签: java hibernate jpa spring-data-jpa

我认为这是一个愚蠢的问题,但我为此困扰了好几天。 我有一个实体,该实体的属性如下所示:

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

我正在使用Spring Data JPA,希望查询该实体并从数组列表中具有确切一组项目的数据库实体中获取。这意味着如果我的数据库中有:

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

我需要在其中传递[即“”“,”第二“](字符串顺序无关)并且仅返回DummyEntity(1,” name1“,[” first“,” second“])的查询。我知道我可以使用Java来做到这一点,但我讨厌它作为解决方法。

我出于以下目的而提出:github demo project,其中我有一个最小的项目,测试失败,我需要成功。我尝试了以下内容:

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 个答案:

答案 0 :(得分:2)

    @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);

答案 1 :(得分:0)

这是另一种方式。

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

在您的服务中,您可以通过以下方式调用它:

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