从@ElementCollection中搜索对象

时间:2016-02-17 09:52:31

标签: java spring jpa spring-data-jpa

我正在使用Spring Data JPA。

我是这样的实体

public class A {

    @CollectionTable(name = "B_ITEMS", joinColumns = @JoinColumn(name = "B_ID"))
    @ElementCollection
    private List<B> bs;

}

和嵌入式课程

@Embeddable
public class B { 

private String prop1


private String prop2


private String prop3

}

如何使用内容@ElementCollection B搜索实体A?

这是我的存储库Spring Data JPA Repositry

public interface ARepo extends PagingAndSortingRepository<Clinic, Long> {

}

哪种查询方法名称适用于我的用例?

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

您似乎在Spring数据中要求基本的IN查询 - findBybsIn(List<B> bs)

答案 2 :(得分:2)

而不是像在@Zeromus中那样使用@Query,你也可以通过方法名称(findByElementCollectionProperty_NestedProperty)来定义它:

public interface ARepo extends JPARepository<A,Long> {

    List<A> findByBs_Prop1(String prop1);
}

有关SpringData如何解析嵌套属性的详细信息,请参阅:

Query Property Expressions

答案 3 :(得分:1)

一种方法可能是在A对象的列表中搜索B对象的所有属性。这意味着要同时对prop1,prop2和prop3使用过滤器。

public interface ARepo extends PagingAndSortingRepository<Clinic, Long> {
    List<A> findByBsProp1AndBsProp2AndBsProp3(String prop1, String prop2, String prop3); 
}