Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将SQL转换为CriteriaBuilder语句_Java_Postgresql_Jpa - Fatal编程技术网

Java 将SQL转换为CriteriaBuilder语句

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

你能帮我把这个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.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();