Jpa准则计数

6

我有一个新问题。我创建了一些代码,从客户端请求生成谓词(Predicate)。这是初始化部分:

 criteriaBuilder = entityManager.getCriteriaBuilder();
 criteriaQuery = criteriaBuilder.createQuery(classEntity);
 root = criteriaQuery.from(classEntity);

当我想获取实体列表时,它的效果非常好:

criteriaQuery.select(root).where(predicate);
entityManager.createQuery(criteriaQuery).getResultList();

但是当我想获取实体数时:
CriteriaQuery<Long> cq = criteriaBuilder.createQuery(Long.class);
cq.select(criteriaBuilder.count(root)).where(predicate);
System.err.println("eee : " +entityManager.createQuery(cq).getSingleResult());

IT技术相关内容翻译如下:

出现异常的原因如下:

java.lang.IllegalArgumentException: 验证标准时发生错误 Caused by: java.lang.IllegalStateException: 未指定任何查询根

可能是因为动态生成的连接关系导致的。

private Path parseField(String field) {
    Path path = null;

    if (field.contains(".")) {

        String [] split = field.split("\\.");
        Join join = root.join(split[0],JoinType.INNER);

        for (int i =1; i < split.length-1; i++) {
            join = join.join(split[i],JoinType.INNER);
        }

        path = join.get(split[split.length-1]);

    } else {
        path = root.get(field);
    }
    return path;
}

如果我替换

cq.select(criteriaBuilder.count(root)).where(previousPredicate);

on

cq.select(criteriaBuilder.count(cq.from(classEntity))).where(previousPredicate);

我会遇到异常错误。
 org.hibernate.hql.ast.QuerySyntaxException: Invalid path: 'generatedAlias1.(someFieldName)' 

你是如何使用parseField的? - Alkanshel
1个回答

6

对我来说一切都很正常:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> q = cb.createQuery(Long.class);
Root<A> r = q.from(A.class);
MapJoin<A, String, String> m = r.joinMap("metadata");
q.select(cb.count(r)).where(cb.equal(m.key(), "A"));
Long rs = em.createQuery(q).getSingleResult();

因此,如果没有MCVE,很难看出您做错了什么。


我解决了这个问题。谓词包含其他CriteriaQuery的metaInfo。我改变了类的架构,为其他查询生成了2个谓词。感谢您的帮助! - Denis Markov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接