java 使用列表查询JPA ElementCollection

u1ehiz5o  于 2023-09-29  发布在  Java
关注(0)|答案(2)|浏览(122)

如何查询至少包含一个搜索条件元素的@ElementCollection
给定这个对应的数据库模式

对于此实体类

@Entity
@Table(name = "companies")
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(nullable = false)
    private String name;

    @ElementCollection
    @CollectionTable(
        name="companies_products",
        joinColumns = @JoinColumn(name="company_id")
    )
    @Column(name="product")
    private List<String> products = new ArrayList<>();

    // ... getters/setters
}

我想在数据库中查询有产品列表的公司。在SQL中我可以做

SELECT DISTINCT
    c.*
    FROM companies c
    LEFT JOIN companies_products cp ON c.id = cp.company_id
    WHERE
        cp.product IN ('food', 'electronics', 'books')

一个等价的HQL/JPQL查询是什么样子的?
我找到了Hibernate的集合相关表达式和限定路径表达式,但无法创建工作查询。

  • FROM Company c WHERE c.products IN (:prods)使用List.of("food", "electronics", "books")作为命名参数

org.springframework.dao.InvalidDataAccessApiUsageException:参数值[phones]与预期类型[java.util.Collection(n/a)]不匹配;嵌套异常为java.lang.IllegalArgumentException:参数值[food]与预期类型[java.util.Collection(n/a)]不匹配

  • FROM Company c WHERE value(c.products) IN (:prods)

无法为公共抽象java.util.List com.example.demo.CompanyRepository.findWithProducts(java.util.List)创建查询!原因:对方法public abstract java.util.List com.example.demo.CompanyRepository.findWithProducts(java.util.List)的查询验证失败!;嵌套异常为java.lang.IllegalArgumentException:方法public abstract java.util.List com.example.demo.CompanyRepository.findWithProducts(java.util.List)的查询验证失败!

  • FROM Company c WHERE elements(c.products) IN (:prods)

无法为公共抽象java.util.List com.example.demo.CompanyRepository.findWithProducts(java.util.List)创建查询!原因:对方法public abstract java.util.List com.example.demo.CompanyRepository.findWithProducts(java.util.List)的查询验证失败!;嵌套异常为java.lang.IllegalArgumentException:方法public abstract java.util.List com.example.demo.CompanyRepository.findWithProducts(java.util.List)的查询验证失败!

lo8azlld

lo8azlld1#

谢谢你克里斯。您建议的查询Select c FROM Company c join c.products p WHERE p IN (:prods)有效。谢谢你的调查。

bkhjykvo

bkhjykvo2#

在我的例子中,我不得不做左连接:

Select c FROM Company c left join c.products p WHERE p IN (:prods)

Join默认情况下是一个内部join,所以你不会得到任何空c.products的结果。

相关问题