我想查找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();
}
但它现在正在运作......任何建议
第二次尝试
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]上找到适当的构造函数[从com.mcd.webex.model.RelatedElements中选择新的java.lang.Integer(count(*))as generatedAlias0,com.mcd.webex。 model.RelatedElements as generatedAlias1 where generatedAlias0.relatedElementsPk.relationId =:param0]
答案 0 :(得分: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();
em - EntityManager
DZI_id - 列名
1 - 搜索值
Dzialy - 实体类
答案 1 :(得分:2)
作为documented,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);
答案 2 :(得分:0)
CSRF