Java 选择所有字段时,要联接的HQL/SQL/Criteria将匹配给定列表中的所有记录

Java 选择所有字段时,要联接的HQL/SQL/Criteria将匹配给定列表中的所有记录,java,sql,hibernate,hql,criteria,Java,Sql,Hibernate,Hql,Criteria,我正在尝试编写一个HQL/Criteria/Native SQL查询,该查询将返回分配给项目列表的所有员工。必须将它们分配给所有项目才能被选择 可以在以下问题的答案中找到使用本机SQL实现这一点的可接受方法: 但是,我想选择Employee e.*的所有字段。不可能通过e.*定义组,应使用DISTINCT。有没有一种方法可以将DISTINCT与COUNT*一起使用,以实现我的目标 我还尝试使用HQL执行此查询。Employee和ProjectAssignment类没有关联,因此无法使用条件加入它

我正在尝试编写一个HQL/Criteria/Native SQL查询,该查询将返回分配给项目列表的所有员工。必须将它们分配给所有项目才能被选择

可以在以下问题的答案中找到使用本机SQL实现这一点的可接受方法:

但是,我想选择Employee e.*的所有字段。不可能通过e.*定义组,应使用DISTINCT。有没有一种方法可以将DISTINCT与COUNT*一起使用,以实现我的目标

我还尝试使用HQL执行此查询。Employee和ProjectAssignment类没有关联,因此无法使用条件加入它们。我使用交叉连接,因为它是执行连接的方式。所以,我的HQL看起来像

select emp from Employee emp, ProjectAssignment pa 
where emp.id = pa.empId and pa.paId IN :list 
group by emp having count(*) = :listSize
但是,由于Hibernate中的错误。它输出的SQL类似于group by emptable.id

子查询动态添加和存在的每个项目的分配表从项目分配pa中选择1,其中列表中每个项目的pa.emp\U id=e.id和pa.proj\U id=[anId]是不可接受的选项

有没有一种方法可以正确地编写这个查询,最好是在HQL中编写,最后我想要一个列表,而不修改映射,也不显式地选择本机SQL中的所有列

编辑:我正在使用Oracle 10g和

如何:

select * from employee x where x.id in(
SELECT e.id 
FROM employee e 
    INNER JOIN proj_assignment a 
        ON e.id = a.emp_id and a.proj_id IN ([list of project ids])
GROUP BY e.id
HAVING COUNT(*) = [size of list of project ids]
)
那么:

select * from employee x where x.id in(
SELECT e.id 
FROM employee e 
    INNER JOIN proj_assignment a 
        ON e.id = a.emp_id and a.proj_id IN ([list of project ids])
GROUP BY e.id
HAVING COUNT(*) = [size of list of project ids]
)

我已经找到了一种在HQL中实现这一点的替代方法,它比我想要的效率要低得多,而且比没有那个讨厌的bug的情况下真正可能实现的效率要低得多,但至少它是有效的。这比为每个项目重复子选择要好,如

and exists (select 1 from project_assignment pa where pa.id = someId and pa.emp_id = e.id)
它包括执行一个自联接子查询,以便为每个员工找出列表中分配给他们的项目的数量,并将结果限制为所有员工中的项目

select e 
from Employee
where :listSize = 
    (select distinct count(*)
     from Employee e2, ProjectAssignment pa
     where 
         e2.id = pa.id_emp and 
         e.id = e2.id
         and pa.proj_id IN :projectIdList
    )

我已经找到了一种在HQL中实现这一点的替代方法,它比我想要的效率要低得多,而且比没有那个讨厌的bug的情况下真正可能实现的效率要低得多,但至少它是有效的。这比为每个项目重复子选择要好,如

and exists (select 1 from project_assignment pa where pa.id = someId and pa.emp_id = e.id)
它包括执行一个自联接子查询,以便为每个员工找出列表中分配给他们的项目的数量,并将结果限制为所有员工中的项目

select e 
from Employee
where :listSize = 
    (select distinct count(*)
     from Employee e2, ProjectAssignment pa
     where 
         e2.id = pa.id_emp and 
         e.id = e2.id
         and pa.proj_id IN :projectIdList
    )

如果我没记错的话,这只在MySQL中是合法的。我使用Oracle编辑的问题来提供此详细信息。据我所知,这是“标准”sql,应该适用于大多数数据库,包括Oracle。实际上,MySQL是一个需要稍微修改语法的数据库——我认为MySQL需要内部select有一个别名。如果我没记错的话,这只在MySQL中是合法的。我使用Oracle编辑的问题来提供此详细信息。据我所知,这是“标准”sql,应该适用于大多数数据库,包括Oracle。实际上,MySQL是一个可能需要稍微修改语法的数据库——我认为MySQL需要内部select有一个别名。