如何查询至少包含一个搜索条件元素的@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)的查询验证失败!
2条答案
按热度按时间lo8azlld1#
谢谢你克里斯。您建议的查询
Select c FROM Company c join c.products p WHERE p IN (:prods)
有效。谢谢你的调查。bkhjykvo2#
在我的例子中,我不得不做左连接:
Join默认情况下是一个内部join,所以你不会得到任何空c.products的结果。