我有以下实体
@Entity
@Table(name = "merchants")
public class Merchant implements Serializable {
...
@ElementCollection
@CollectionTable(name = "keywords", joinColumns = @JoinColumn(name = "merchant_id"))
private List<String> keywords;
...
}
具有相应的静态元模型
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Merchant.class)
public abstract class Merchant_ {
...
public static volatile ListAttribute<Merchant, String> keywords;
...
}
如何使用CriteriaBuilder
编写查询以检查keywords
属性是否包含给定值?
答案 0 :(得分:0)
结果非常简单
String keyword = "<KEYWORD>";
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Merchant> query = cb.createQuery(Merchant.class);
Root<Merchant> root = query.from(Merchant.class);
query.select(root).where(
cb.isMember(keyword, root.get(Merchant_.keywords)));
return em.createQuery(query).getResultList();
但原始任务是查找包含给定集合中至少一个关键字的实体。目前我没有看到任何更好的解决方案,而是将isMemeber
谓词与or
子句联合起来,用于关键字集合中的每个项目。然而,预计其中没有那么多。
但是,任何更好的解决方案都值得赞赏。