我认为这是一个愚蠢的问题,但我为此困扰了好几天。 我有一个实体,该实体的属性如下所示:
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);
答案 0 :(得分:2)
不支持size
关键字。 https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords
但是您可以将此方法添加到存储库中,然后将服务方法添加到没有大小参数的情况下
findAllByItems(List<String> items, Pageable pageable);
,因为它可以在内部传递items.size()
方法
@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));