Java 我怎样才能加上?’;带ON条款的外部连接条件;在JPA中使用Hibernate作为持久性提供者?
使用hibernate时,此方法失败:Java 我怎样才能加上?’;带ON条款的外部连接条件;在JPA中使用Hibernate作为持久性提供者?,java,sql,database,hibernate,jpa,Java,Sql,Database,Hibernate,Jpa,使用hibernate时,此方法失败: SELECT e, COUNT(p) FROM Employee e JOIN e.projects p ON e.timeEmployed <= p.timeStarted GROUP BY e SELECT e,COUNT(p)FROM Employee e JOIN e.projects p ON e.timeEmployed不能使用某些聚合函数对整个实体进行分组 您可以这样做: SELECT e.id, COUNT(p
SELECT e, COUNT(p) FROM Employee e JOIN e.projects p ON e.timeEmployed <= p.timeStarted GROUP BY e
SELECT e,COUNT(p)FROM Employee e JOIN e.projects p ON e.timeEmployed不能使用某些聚合函数对整个实体进行分组
您可以这样做:
SELECT
e.id,
COUNT(p)
FROM Employee e
JOIN e.projects p
WHERE e.timeEmployed <= p.timeStarted
GROUP BY e.id
我决定的解决办法与你的建议很相似,但有点相反。将查询条件移动到ON子句而不是在WHERE子句中指定它的原因是为了确保结果中包含所有员工实体
作为第一步,我选择了
SELECT e FROM Employee e
然后,我发布了一个二次查询,以统计每个员工受雇后开始的项目:
SELECT
e.id,
COUNT(p)
FROM Employee e
JOIN e.projects p
WHERE e.timeEmployed <= p.timeStarted AND e in :employees
GROUP BY e
选择
e、 身份证,
计数(p)
来自雇员e
加入e.p
在e.timeEmployed中,使用二次查询的想法对我不太有吸引力,但正如你正确地建议的那样,我似乎没有什么选择,因为我不打算切换到EclipseLink。希望Hibernate很快就会支持这一点,我们可以利用外部连接条件,而不是发出二次查询。
package entity;
import java.time.Instant;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
@Entity
public class Project {
@Id
private Long id;
@ManyToMany
private Collection<Employee> employees;
@Basic
private Instant timeStarted;
}
SELECT
e.id,
COUNT(p)
FROM Employee e
JOIN e.projects p
WHERE e.timeEmployed <= p.timeStarted
GROUP BY e.id
select e FROM Employee e where id in :ids
SELECT e FROM Employee e
SELECT
e.id,
COUNT(p)
FROM Employee e
JOIN e.projects p
WHERE e.timeEmployed <= p.timeStarted AND e in :employees
GROUP BY e