我正在尝试编写HQL/Criteria/Native SQL查询,它将返回分配给项目列表的所有员工。必须将它们分配到全部项目才能被选中。HQL/SQL /准则加入 - 匹配给定列表中的所有记录,同时选择所有字段
与本地SQL实现这一目标的一种可接受的方式可以在这个问题的答案中找到:T-SQL - How to write query to get records that match ALL records in a many to many join:
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]
不过,我要选择雇员(e.*
)的所有领域。无法定义SQL grouping by all the columns(GROUP BY e.*
),应该使用DISTINCT
。有没有办法使用DISTINCT
与COUNT(*)
完成我想要的?
我也试过使用HQL来执行此查询。 Employee
和ProjectAssignment
类没有关联,因此使用Criteria来加入它们是不可能的。我使用交叉连接,因为这是执行Join without association in HQL的方式。所以,我的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的一个错误,GROUP BY entity does not work。它输出的SQL类似于group by (emptable.id)
。
分割每个项目的分配表(动态地为列表中的每个项目添加and exists (select 1 from proj_assignment pa where pa.emp_id=e.id and pa.proj_id = [anId])
)不是可接受的选项。
有没有办法正确地写这个查询,最好在HQL(最后我想要一个List<Employee>
),而不修改映射,并且没有明确选择本地SQL中的所有列?
编辑:我使用的是Oracle 10g和hibernate-annotations-3.3.1.GA
如果我没有记错的话,这只是在MySQL合法。我正在使用Oracle(已编辑的问题来提供此详细信息)。 –
据我所知,这是'标准'sql,并且应该可以与大多数数据库(包括Oracle)一起工作。实际上,MySQL是这个语法可能需要稍微改变的数据库 - 我认为MySQL会要求内部选择有一个别名。 – GreyBeardedGeek