2011-11-17 47 views
2

我正在尝试编写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 columnsGROUP BY e.*),应该使用DISTINCT。有没有办法使用DISTINCTCOUNT(*)完成我想要的?

我也试过使用HQL来执行此查询。 EmployeeProjectAssignment类没有关联,因此使用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

回答

0

我找到了另一种方法在HQL实现这一目标,它更低效比我想要的要多,(而且没有那种令人讨厌的错误真正可行),但至少它是有效的。这比为了找出重复的子查询像

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 
    ) 
0

如何:

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] 
) 
+0

如果我没有记错的话,这只是在MySQL合法。我正在使用Oracle(已编辑的问题来提供此详细信息)。 –

+0

据我所知,这是'标准'sql,并且应该可以与大多数数据库(包括Oracle)一起工作。实际上,MySQL是这个语法可能需要稍微改变的数据库 - 我认为MySQL会要求内部选择有一个别名。 – GreyBeardedGeek

相关问题