Ran*_*Ran 5 hibernate jpa spring-data spring-data-jpa
我正在尝试找到一种解决方法来解决 JPA 不支持 order by 子查询的问题。
如何使用 CriteriaBuilder 实现以下查询?
@Query(value =
"SELECT DISTINCT t,(SELECT sum(ta.size) FROM TaskArea ta WHERE ta.task.id = t.id) as total " +
"FROM Task t " +
"ORDER BY total")
List<Tuple> ordered();
Run Code Online (Sandbox Code Playgroud)
我尝试执行以下操作,但它不起作用:
public List<Tuple> ordered() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createQuery(Tuple.class);
Root<Task> root = cq.from(Task.class);
Subquery sub = cq.subquery(Long.class);
Root<TaskArea> subRoot = sub.from(TaskArea.class);
sub.select(cb.sum(subRoot.get(TaskArea_.size)));
sub.where(cb.equal(root.get(Task_.id), subRoot.get(TaskArea_.task).get(Task_.id)));
sub.alias("total");
cq.multiselect(root, sub.getSelection());
cq.orderBy(cb.asc(sub)); // duplicate the subquery into order by section instead of use the alias
// cq.orderBy(cb.asc(cb.literal("total"))); // not working
return em.createQuery(cq).getResultList();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉 CriteriaBuilder 使用别名而不是重复子查询?
(请不要建议使用联接等重写查询 - 实际情况非常复杂,并且不能轻松完成或根本无法使用联接完成)
| 归档时间: |
|
| 查看次数: |
1448 次 |
| 最近记录: |