我是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();
删除它会解决问题。