在CriteriaQuery中使用静态元模型的ListAttribute类型的字段

时间:2014-11-30 13:24:35

标签: java jpa criteria-api

我有以下实体

@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属性是否包含给定值?

1 个答案:

答案 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子句联合起来,用于关键字集合中的每个项目。然而,预计其中没有那么多。

但是,任何更好的解决方案都值得赞赏。