2016-07-07 3 views
0

に参加:学部の無効な値が含まれていると、原因教師でいくつかの古いレコードにJPA 2.0 NamedQuery左は、私は以下のように、教師の二つのテーブルの部門を持っている

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

、例えば、部門= 5と教師、 Departmentsには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を使用して、期待される結果を得ることができましたが、私はLEFT JOINを使用してJPAで行う方法がわからず、Teachersエンティティとして結果を返します。

私はTeachersエンティティとDepartmentsエンティティの両方を定義しましたが、古いレコードのために教師または部門エンティティで@OneToOne/@OneToMany/@ManyToOneの関係を定義する必要があるかどうかはわかりません。

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

class Departments 
String D_ID; 
String Code; 

私は初心者ですが、SpringDataJPAとHibernateでJPA 2.0を使用しています。

お願いします。

答えて

0

リポジトリインタフェースでnamedQueryを使用し、教師クラスでコンストラクタを定義し、それをクエリで使用して必要な結果を返すことができます。

@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; 
} 

そして、あなたは教師のためのリポジトリのインターフェースを定義していない場合教師は、あなたがこのようにそれを行うことができますパッケージmain.ctであると仮定これは次のようになります:

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

または、エンティティでann otation @NamedQuery このリンクで説明したように:

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

+0

私がしようとしたが失敗。私は次の例外があります。バージョンに問題はありますか?私はHibernateを使用しています。4.2.21 原因:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:予期しないトークン:ONに近い行1 – Calvin

+0

バージョンの問題だと思っていません。オン条件を削除してWHERE句に入れます。私は答えを編集しました。私の場合は動作しますが、このリンクで説明しているように、hqlでJOIN ONを使用することはお勧めできません。http://stackoverflow.com/questions/12003430/hibernate-query-syntax-exception-org- hibernate-hql-ast-querysyntaxexception-u – amicoderozer

関連する問題