我正在嘗試編寫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