Java 将SQL转换为CriteriaBuilder语句
你能帮我把这个SQL语句转换成CriteriaBuilder语句吗?我遇到的问题是内部JOIN语句Java 将SQL转换为CriteriaBuilder语句,java,postgresql,jpa,Java,Postgresql,Jpa,你能帮我把这个SQL语句转换成CriteriaBuilder语句吗?我遇到的问题是内部JOIN语句 SELECT th.id, th.date, th.exercise_id FROM traininghistory th INNER JOIN ( SELECT exercise_id, MAX(date) as maxdate FROM traininghistory group by exercise_id ) AS tm on tm.exercise_id = th.exe
SELECT th.id, th.date, th.exercise_id
FROM traininghistory th
INNER JOIN (
SELECT exercise_id, MAX(date) as maxdate
FROM traininghistory
group by exercise_id
) AS tm on tm.exercise_id = th.exercise_id AND th.date = tm.maxdate
WHERE th.accountid = :accountId
通过在不使用
内部联接的情况下重新格式化查询,找到了解决方案。下面的SQL查询实现了与问题中的SQL查询相同的结果,但对我来说可以翻译成CriteriaAPI
FROM traininghistory th
WHERE th.datedone in (
SELECT MAX(tm.datedone)
FROM traininghistory tm
GROUP BY tm.exercise_id
)
AND th.accountid = :userId
因此,以此为基础,使用标准API的声明如下:
// define query
CriteriaBuilder cb = this.entityManager.getCriteriaBuilder();
CriteriaQuery<TrainingHistory> query = cb.createQuery(TrainingHistory.class);
Root<TrainingHistory> root = query.from(TrainingHistory.class);
query.select(root);
// define subquery
Subquery<Integer> subquery = query.subquery(Integer.class);
Root<TrainingHistory> rootSubquery = subquery.from(TrainingHistory.class);
Expression<Integer> max = cb.max(rootSubquery.get(TrainingHistory_.DATE_DONE));
subquery.select(max);
subquery.groupBy(rootSubquery.get(TrainingHistory_.exercise));
// compose whole query
query.where(
cb.and(
cb.in(root.get(TrainingHistory_.DATE_DONE)).value(subquery),
cb.equal(root.get(TrainingHistory_.ACCOUNT_ID), userId)
)
);
return this.entityManager.createQuery(query).getResultList();
//定义查询
CriteriaBuilder cb=this.entityManager.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(TrainingHistory.class);
Root=query.from(TrainingHistory.class);
查询。选择(根);
//定义子查询
Subquery Subquery=query.Subquery(Integer.class);
Root rootSubquery=subquery.from(TrainingHistory.class);
表达式max=cb.max(rootSubquery.get(TrainingHistory\uu.DATE\u DONE));
子查询。选择(最大值);
groupBy(rootSubquery.get(TrainingHistory_uzy.exercise));
//组合整个查询
请问,在哪里(
cb.和(
cb.in(root.get(TrainingHistory\uu.DATE\u DONE)).value(子查询),
cb.equal(root.get(TrainingHistory\u.ACCOUNT\u ID),userId)
)
);
返回此.entityManager.createQuery(query.getResultList();
请发布受影响的实体。没有任何实体,不可能提出任何建议。
// define query
CriteriaBuilder cb = this.entityManager.getCriteriaBuilder();
CriteriaQuery<TrainingHistory> query = cb.createQuery(TrainingHistory.class);
Root<TrainingHistory> root = query.from(TrainingHistory.class);
query.select(root);
// define subquery
Subquery<Integer> subquery = query.subquery(Integer.class);
Root<TrainingHistory> rootSubquery = subquery.from(TrainingHistory.class);
Expression<Integer> max = cb.max(rootSubquery.get(TrainingHistory_.DATE_DONE));
subquery.select(max);
subquery.groupBy(rootSubquery.get(TrainingHistory_.exercise));
// compose whole query
query.where(
cb.and(
cb.in(root.get(TrainingHistory_.DATE_DONE)).value(subquery),
cb.equal(root.get(TrainingHistory_.ACCOUNT_ID), userId)
)
);
return this.entityManager.createQuery(query).getResultList();