count*with where子句使用JPA条件查询

Sur*_*rya 5 criteria-api jpa-2.0

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

假设Set tempSet包含[2,3,4]我必须使用jpa条件查询检查related_element表中包含的这些值

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();
        }
Run Code Online (Sandbox Code Playgroud)

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

第二次尝试

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();
        }
Run Code Online (Sandbox Code Playgroud)

它在qry.setParameter上给出了异常

无法在类[java.lang.Integer]上找到适当的构造函数[从com.mcd.webex.model.RelatedElements中选择新的java.lang.Integer(count(*))as generatedAlias0,com.mcd.webex.model.RelatedElements as generatedAlias1 where generatedAlias0.relatedElementsPk.relationId =:param0]

小智 7

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();
Run Code Online (Sandbox Code Playgroud)

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


Mik*_*unu 2

根据记录,CriteriaBuilder.count 返回Expression<java.lang.Long>CriteriaQuery因此,和 的类型参数TypedQuery也应该是 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);
Run Code Online (Sandbox Code Playgroud)