2011-11-17 49 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

相關問題