簡體   English   中英

涉及聯接的JPA Critera查詢計數結果

[英]JPA Critera Query count results involving join

我正在使用休眠和JPA條件API,並嘗試創建可重用的實用程序方法來確定查詢將返回多少行。

目前我有這個:

Long countResults(CriteriaQuery cq, String alias){
    CriteriaBuilder cb = em().getCriteriaBuilder();
    CriteriaQuery<Long> countQuery = cb.createQuery(Long.class);
    Root ent = countQuery.from(cq.getResultType());
    ent.alias(alias);
    countQuery.select(cb.count(ent));
    Predicate restriction = cq.getRestriction();
    if(restriction != null){
        countQuery.where(restriction);
    }
    return em().createQuery(countQuery).getSingleResult();
}

我這樣使用:

CriteriaBuilder cb = em().getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(modelClass());
root.alias("ct");
cq.select(root);

TypedQuery<User> query = em().createQuery(cq);
long count = countResults(cq, "ct");

而且效果很好。 但是,當我使用更復雜的查詢時

Join<UserThing, Thing> j = root.join(User_.things).join(UserThing_.thing);
cq.where(somePredicate);

我對countResults()調用產生了org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'myAlias.name'異常org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'myAlias.name'<AST>:0:0: unexpected end of subtree left-hand operand of a binary operator was null

我猜想這與聯接有關,並且我需要以某種方式對其進行別名,但是到目前為止我還沒有取得任何成功。

救命?

我遇到了同樣的問題,並且解決了:

CriteriaQuery<Long> countCriteria = cb.createQuery(Long.class);
Root<EntityA> countRoot = countCriteria.from(cq.getResultType());
Set<Join<EntityA, ?>> joins = originalEntityRoot.getJoins();
for (Join<EntityA, ?> join :  joins) {
    countRoot.join(join.getAttribute().getName());
}
countCriteria.select(cb.count(countRoot));
if(finalPredicate != null)
    countCriteria.where(finalPredicate);

TypedQuery<Long> queryCount = entityManager.createQuery(countCriteria);
Long count = queryCount.getSingleResult();

哪里

originalEntityRoot是我使用where子句進行查詢的主要根目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM