2012-05-15 59 views
0

我有3個表:行動,部門,員工JPQL - 避免使用加入

action (
    id 
    employee_id 
    name 
) 

employee(
    id 
    department_id 
) 

department (
    id 
    name 
) 
  • action.employee_id可以爲空

我使用下面的查詢:

select a.id, a.name, d.name from action a, employee e, department d where   a.employee_id=e.id and e.department_id=d.id 

但是在沒有employee_id的情況下我沒有在結果中獲得這些行

有沒有辦法克服這一點,而不使用左連接?


試過到目前爲止(沒有工作):

select a.id, a.name, d.name from action a, employee e, department d where   (a.employee_id=e.id and e.department_id=d.id) or a.employee_id is null 
+0

它爲什麼不工作?你看到了什麼輸出? – Damian

+0

它返回了動作和部門名稱的所有組合(對於沒有'employee_id'的行)。如果我有x行動,並在所有他們'employee_id'爲空,y部門它返回x * y結果,而不是隻有x結果 – levtatarov

回答

3

你錯過了JPA的整點:具有與其他直接對象相關聯,而不是對象持有其他對象ID的對象。

您應該有一個具有ManyToOne關聯的Action實體到一個Employee實體,該實體將與Department實體具有ManyToOne關聯。 Action中不應該有employeeId字段。員工中不應該有departmentId字段。

這將允許你,例如,通過簡單地調用

action.getEmployee().getDepartment().getName() 

得到一個行動的部門名字,你將能夠使用左聯接在查詢中,這將成爲

select a.id, a.name, d.name 
from Action a 
left join a.employee e 
left join e.department d 

並會給你預期的結果

+0

我知道這是使用JPA正確的方式,但從我瞭解它也導致加載更大的對象到緩存中,我想避免這種情況。與核心業務邏輯中的動作表沒有重要聯繫,所以我很好地使用了一次性解決方案。 我想到一個很像你發佈的查詢,但我不想創建這些連接,如果我不會廣泛使用它們 - 這就是我試圖避免使用加入 – levtatarov

+0

我認爲,爲了防止你可以使用(fetch = FetchType.LAZY) – Damian

+0

你的理解是錯誤的。每個關聯都可以標記爲延遲加載。你在與這個工具作鬥爭,因爲你沒有采取行動。不要驚訝地碰到牆壁。你最好的選擇,如果你想這樣做你的方式是使用左連接的本地SQL查詢。 –