JPA标准对左外连接执行计数

时间:2017-02-03 08:24:12

标签: java jpa criteria-api

我是JPA标准的新手。现在我想为我的DB2查询创建特定的标准,但没有运气。下面是我希望使用JPA标准创建的DB2查询:

SELECT 
    p.payeeId, 
    p.payeeName, 
    COUNT(s.id) AS noOfSetup 
FROM 
    PAYEE p 
LEFT JOIN 
    SETUP s
on 
    p.payeeId = s.payeeId 
GROUP BY
    p.payeeId,
    p.payeeName

以下是我尝试过的JPA标准:

CriteriaBuilder builder = em.getCriteriaBuilder();

CriteriaQuery<Tuple> criteriaQuery = builder.createQuery(Tuple.class);
Root<Payee> root = criteriaQuery.from(Payee.class);
Join<Payee, Setup> join = root.join(Payee_.setups, JoinType.LEFT);
criteriaQuery.multiselect(
        root.get(Payee_.payeeId),
        root.get(Payee_.payeeName),
        builder.count(join.get(Setup_.id))
        );
criteriaQuery.groupBy(
        root.get(Payee_.payeeId),
        root.get(Payee_.payeeName)
        );
TypedQuery<Tuple> query = em.createQuery(criteriaQuery);
List<Tuple> entities = query.getResultList();

以下是JPA的日志

select
    payee0_.payeeId as col_0_0_,
    payee0_.payeeName as col_1_0_,
    count(setup1_.id) as col_2_0_ -- <----- this should refer setup2_ but not setup1_
from 
    PAYEE payee0_ 
left outer join 
    SETUP setup2_ 
on 
    payee0_.payeeId=setup2_.payeeId 
cross join 
    SETUP setup1_  -- <----------------- the extra stuff, why?
group by 
    payee0_.payeeId,
    payee0_.payeeName

这与我的预期完全不同。如何创建JPA条件作为DB2查询?

编辑1:

更改为Join<Payee, Setup> join = root.join("setups", JoinType.LEFT);

select
    payee0_.payeeId as col_0_0_,
    payee0_.payeeName as col_1_0_,
    count(setup2_.id) as col_2_0_ -- <----- now, it refer to the correct setup2_
from 
    PAYEE payee0_ 
left outer join 
    SETUP setup2_ 
on 
    payee0_.payeeId=setup2_.payeeId 
cross join 
    SETUP setup1_  -- <----------------- still here
group by 
    payee0_.payeeId,
    payee0_.payeeName

编辑2:

我为自己的错误道歉,尤其是@Matthieu Saleta。我没有显示代码行,因为我觉得没关系。但实际上它会影响我的代码。这是我创建的实际JPA标准。

CriteriaBuilder builder = em.getCriteriaBuilder();

CriteriaQuery<Tuple> criteriaQuery = builder.createQuery(Tuple.class);
Root<Payee> root = criteriaQuery.from(Payee.class);
Root<Setup> root = criteriaQuery.from(Setup.class); // <------ This extra line
Join<Payee, Setup> join = root.join(Payee_.setups, JoinType.LEFT);
criteriaQuery.multiselect(
        root.get(Payee_.payeeId),
        root.get(Payee_.payeeName),
        builder.count(join.get(Setup_.id))
        );
criteriaQuery.groupBy(
        root.get(Payee_.payeeId),
        root.get(Payee_.payeeName)
        );
TypedQuery<Tuple> query = em.createQuery(criteriaQuery);
List<Tuple> entities = query.getResultList();

删除它会解决问题。

0 个答案:

没有答案
相关问题