【问题标题】:Searching An object from @ElementCollection从@ElementCollection 中搜索对象
【发布时间】:2026-02-11 04:30:01
【问题描述】:

我正在使用 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 存储库

public interface ARepo extends PagingAndSortingRepository<Clinic, Long> {

}

什么查询方法名称适用于我的用例?

【问题讨论】:

    标签: java spring jpa spring-data-jpa


    【解决方案1】:

    您似乎要求在 Spring Data 中进行基本的 IN 查询 - findBybsIn(List&lt;B&gt; bs)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        public interface ARepo extends JPARepository<A,Long> {
        
            List<A> findByBs_Prop1(String prop1);
        }
        

        更多关于 SpringData 如何解析嵌套属性的信息可以在下面找到:

        Query Property Expressions

        【讨论】:

        • 如果 Bs 不是可嵌入对象的集合而是简单字符串的集合,该方法会如何?比如说,我想知道一个特定的字符串参数是否与元素集合中的一个字符串匹配。那么该方法会像这样:findByBsIn(String arg) 还是应该有所不同?
        【解决方案4】:

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

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

        【讨论】:

        • 这是一个基于 @Embeddable 对象的所有 3 个属性的 findby。因此,如果我需要在 A 列表中搜索特定对象 B,我可以使用此方法并过滤所有属性,这意味着过滤对象本身。
        • 虽然这段代码可以解决问题,但最好补充说明一下,并为可能不理解这段代码的人解释它是如何工作的。
        • 感谢您的反馈。另外,如果我已经在 cmets 中解释过,我会尝试改进答案