5

我想查找related_elements 表的记录,其中relationId 属于一个列表

假设 Set tempSet contains[2,3,4] 我必须使用 jpa 标准查询检查这些值是否包含在相关元素表中

CriteriaBuilder cb1=entityManager.getCriteriaBuilder();
        CriteriaQuery<RelatedElements> cq1=cb1.createQuery(RelatedElements.class);
        Root<RelatedElements> RelatedElementsRoot=cq1.from(RelatedElements.class);
    for (Integer tSet : tempSet) {
            ParameterExpression<Integer> pRelatedElement=cb1.parameter(Integer.class);
            cq1.multiselect(cb1.count(RelatedElementsRoot.<RelatedElements>get("relatedElementsPk").<Integer>get("relationId"))).where(cb1.equal(RelatedElementsRoot.get("relationId"), pRelatedElement));
            TypedQuery<RelatedElements> qry = entityManager.createQuery(cq1);
            qry.setParameter(pRelatedElement, tSet);
            count = entityManager.createQuery(cq1).getSingleResult().getRelationId();
        }

但它现在正在工作......任何建议

第二次尝试

CriteriaBuilder cb1=entityManager.getCriteriaBuilder();
        CriteriaQuery<Integer> cq1 = cb1.createQuery(Integer.class);
        Root<RelatedElements> RelatedElementsRoot=cq1.from(RelatedElements.class);
        for (Integer tSet : tempSet) {
            ParameterExpression<Integer> pRelatedElement=cb1.parameter(Integer.class);
            cq1.multiselect(cb1.count(cq1.from(RelatedElements.class)));
            cq1.where((cb1.equal(RelatedElementsRoot.get("relatedElementsPk").get("relationId"), pRelatedElement)));
            TypedQuery<Integer> qry = entityManager.createQuery(cq1);
            qry.setParameter(pRelatedElement, tSet);
            count =qry.getSingleResult();
        }

它在 qry.setParameter 处给出异常

无法在类 [java.lang.Integer] 上找到适当的构造函数 [select new java.lang.Integer(count(*)) from com.mcd.webex.model.RelatedElements as generatedAlias0, com.mcd.webex.model.RelatedElements作为 generateAlias1 where generatedAlias0.relatedElementsPk.relationId=:param0]

4

3 回答 3

8
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<Dzialy> root = cq.from(Dzialy.class);
EntityType <Dzialy> Dzialy_ = root.getModel();

cq.select((cb.countDistinct(root)));
cq.where( cb.equal( root.get(Dzialy_.getSingularAttribute("DZI_id")), 1) ); 

long l = em.createQuery(cq).getSingleResult();

em - EntityManager
DZI_id - 列名
1 - 搜索值
Dzialy - 实体类

于 2014-01-16T10:43:29.403 回答
2

文档所述,CriteriaBuilder.count 返回Expression<java.lang.Long>。因此,类型参数CriteriaQueryTypedQuery也应该是 Long。同样适用于count变量类型。

当只有一个值被选择时,使用CriteriaQuery.select而不是multiselect是有意义的,因为这样一个错误已经在编译时被捕获。

Long count;
...
CriteriaQuery<Long> cq1 = cb1.createQuery(Long.class);
...
cq1.select(cb1.count(cq1.from(RelatedElements.class)));
...
TypedQuery<Long> qry = entityManager.createQuery(cq1);
于 2013-10-04T19:58:27.173 回答
0
CriteriaBuilder qb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> cq = qb.createQuery(Long.class);
cq.select(qb.count(cq.from(YourEntity.class)));
cq.where(/*your stuff*/);
return entityManager.createQuery(cq).getSingleResult();
于 2017-03-09T07:02:57.720 回答