Java 从@ElementCollection中搜索对象
我使用的是Spring数据JPA 我是这样一个实体Java 从@ElementCollection中搜索对象,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,我使用的是Spring数据JPA 我是这样一个实体 public class A { @CollectionTable(name = "B_ITEMS", joinColumns = @JoinColumn(name = "B_ID")) @ElementCollection private List<B> bs; } 如何使用contents@ElementCollection B搜索实体A 这是我的存储库Spring数据JPA存储库 public i
public class A {
@CollectionTable(name = "B_ITEMS", joinColumns = @JoinColumn(name = "B_ID"))
@ElementCollection
private List<B> bs;
}
如何使用contents@ElementCollection B搜索实体A
这是我的存储库Spring数据JPA存储库
public interface ARepo extends PagingAndSortingRepository<Clinic, Long> {
}
公共接口ARepo扩展了分页和排序存储库{
}
什么查询方法名称适用于我的用例?您似乎要求在Spring数据中进行基本的IN查询-
findBybsIn(列表bs)
@ElementCollection
只是映射@OneToMany
关系的一种简单方法
因此,您可以像往常一样加入他们:
public interface ARepo extends PagingAndSortingRepository<A, Long> {
@Query("select a from A a join a.bs b where b.prop1 = :prop1 and ...")
A findByProps(@Param("prop1") String prop1)
}
公共接口ARepo扩展了分页和排序存储库{
@查询(“从a中选择a并加入a.bs b,其中b.prop1=:prop1和…”)
findByProps(@Param(“prop1”)字符串prop1)
}
除了在@Zeromus answer中使用@Query之外,您还可以通过方法名称(findByElementCollectionProperty\u NestedProperty)来定义它:
公共接口ARepo扩展了JPARepository一种方法是在a对象列表中搜索B对象的所有属性。这意味着同时使用prop1、prop2和prop3的过滤器
public interface ARepo extends PagingAndSortingRepository<Clinic, Long> {
List<A> findByBsProp1AndBsProp2AndBsProp3(String prop1, String prop2, String prop3);
}
公共接口ARepo扩展了分页和排序存储库{
列出FindBySprop1、BSProp2和BSProp3(字符串prop1、字符串prop2、字符串prop3);
}
这是一个基于@Embeddeble object的所有3个属性的findby。因此,如果我需要在A列表中搜索特定对象B,我可以使用此方法并筛选所有属性,这意味着对对象本身进行筛选。虽然此代码可以解决问题,但最好添加详细说明,并向可能不理解此代码的人解释其工作原理。感谢您的反馈。另外,如果我已经在评论中解释过,我试图改进答案,如果Bs不是一个可嵌入的集合,而是一个简单字符串的集合,那么这个方法会是什么样子?比如,我想知道一个特定的字符串参数是否与elementcollection中的字符串匹配。然后,该方法是如下所示:findByBsIn(String arg)
,还是应该有所不同?
public interface ARepo extends JPARepository<A,Long> {
List<A> findByBs_Prop1(String prop1);
}
public interface ARepo extends PagingAndSortingRepository<Clinic, Long> {
List<A> findByBsProp1AndBsProp2AndBsProp3(String prop1, String prop2, String prop3);
}