2016-07-07 73 views
0

我有兩個表部門,教師,象下面這樣:JPA 2.0 NamedQuery左連接

Departments  Teachers 
---    --- 
D_ID   T_ID 
Code   Name 
       Dept (logically reference D_ID) 

由於教師一些老的紀錄,以包含部門的非法值,例如,教師與部門= 5,但部門中沒有D_ID = 5。

在SQL中,我可以使用 SELECT t.*, COALESCE(d.Code, t.Dept) as Dept FROM Teachers t LEFT JOIN Departments d ON d.D_ID = t.Dept來獲得預期的結果,但我不確定如何在JPA中使用LEFT JOIN進行操作,並將結果作爲教師實體返回。

我已經定義了教師實體和部門實體,但由於舊記錄,我不確定是否應該在教師或部門實體中定義@OneToOne/@OneToMany/@ManyToOne關係。

class Teachers 
String T_ID; 
String Name; 
String Dept; 
@Transient 
String DeptCode; 

class Departments 
String D_ID; 
String Code; 

我是一個初學者使用JPA,我使用SpringDataJPA和Hibernate的JPA 2.0。

請給予一些幫助。

回答

0

您可以在存儲庫接口中使用namedQuery並在課堂教師中定義構造函數,並在查詢中使用它來返回所需的結果。假設教師是包main.ct你可以做這樣的:

@Query("SELECT new main.ct.Teachers(t.T_ID, t.Name, t.Dept, COALESCE(d.Code, t.Dept)) FROM Teachers t LEFT JOIN Departments d WHERE d.D_ID = t.Dept") 
    List<Teachers> findAllTeachers(); 

並定義構造函數:

public Teachers(String id, String name, String dept, String deptCode) 
{ 
    this.T_ID = id; 
    this.Name = name; 
    this.Dept = dept; 
    this.DeptCode = deptCode; 
} 

如果你還沒有定義教師資源庫接口,這樣做:

@Repository 
public interface TeachersRepo extends JpaRepository<Teachers, String>{ 
//write here your query 
} 

或者你可以在你的實體做同樣的事情與安浮選@NamedQuery 在這個環節上的解釋:

http://www.objectdb.com/java/jpa/query/named

+0

我試過,但失敗。我有以下例外。它是版本問題嗎?我正在使用休眠4.2.21 引起:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:意外的標記:在第1行附近 – Calvin

+0

我不認爲這是一個版本問題,請嘗試刪除條件並將其放在WHERE子句中。我編輯了答案。在我的情況下,它的工作原理,但我只是發現,不建議在hql中使用JOIN ON,就像這個鏈接中所解釋的:http://stackoverflow.com/questions/12003430/hibernate-query-syntax-exception-org-休眠-HQL-AST-querysyntaxexception-U – amicoderozer