Java 我怎样才能加上?’;带ON条款的外部连接条件;在JPA中使用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

使用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) 
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