【问题标题】:Query entity containing a property of type ArrayList<String>containing a specific set of strings using spring data jpa使用 spring data jpa 查询包含 ArrayList<String> 类型属性的实体,该属性包含一组特定的字符串
【发布时间】:2020-07-14 18:44:29
【问题描述】:

我认为这是一个愚蠢的问题,但我被困了好几天。 我有一个属性为字符串列表的实体,如下所示:

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

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

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

我需要一个我通过的查询,即 ["first", "second"](字符串顺序无关紧要),我只返回 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);  

【问题讨论】:

标签: java hibernate jpa spring-data-jpa


【解决方案1】:
    @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);

【讨论】:

    【解决方案2】:

    这是另一种方法。

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

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

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

    【讨论】:

    • 我会在以后测试你的答案,我不知道“示例”这个词,但似乎很有用。目前我忙于工作......所以推迟这个。我的评论很明确地说,下面的答案不仅会检查您暗示的尺寸。我无法确定如何澄清,但我运行了十几个单元测试(因为在我看来,它似乎只基于大小)并且它总是只找到具有确切列表项的实体。我想我和你都需要多学习一点 sql。但是,您的答案可能有效并且更优雅,因此请检查一下。
    • 你是对的,我没有正确阅读整个查询。为了避免混淆,我更改了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2016-08-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    相关资源
    最近更新 更多