2017-05-21 1 views
1

私は、Hibernateでの簡単なfindメソッドました:やるcreateNativeQueryメソッドにエンティティクラスのパラメータを渡すん何エンティティクラスのパラメータをcreateNativeQueryに渡すとどうなりますか?

@Override 
public TblUser findByUsername(String username) { 
    return (TblUser) entityManager.createNativeQuery("SELECT * FROM tblUser WHERE username = ?", TblUser.class) 
      .setParameter(1, username) 
      .getSingleResult(); 
} 

を?私はそれを渡すことができますし、いずれかの方法私はJavaを使用してクエリから結果をキャストしました。だから何が前のコードスニペットと、この1との違いです:documentation

@Override 
public TblUser findByUsername(String username) { 
    return (TblUser) entityManager.createNativeQuery("SELECT * FROM tblUser WHERE username = ?") 
      .setParameter(1, username) 
      .getSingleResult(); 
} 

言及した唯一の違いは、私は削除して、更新する最初のメソッドを使用する必要があるということです。それは2つの方法の唯一の違いですか?それが結果を返すことをプログラマに伝えるには?それはコンパイラに影響を与えますか?

答えて

1

最初のクエリは、の代わりにオブジェクト一覧[]を返します。 各オブジェクト[]には、データベースから返されたレコードが1つ含まれています。 次に、配列を繰り返し処理し、各Objectを特定の型にキャストし、それらをドメインモデルにマップする必要があります。 その名前に基づいてエンティティプロパティに返される列をマップしようとするこれは、反復コードの多くを作成し、タイプが

あなたの2番目のクエリは、復帰にエンティティとJPAの実装(例えば休止状態)のすべてのプロパティを必要とするキャストタイプします。これが成功すると、EntityManagerは、現在の永続コンテキストによって管理される、完全に初期化されたAuthorエンティティのリストを返します。したがって、JPQLクエリを使用した場合と同じ結果になりますが、JPQLの小さな機能セットに限定されません。詳細について

http://www.thoughts-on-java.org/result-set-mapping-basics/

を見ます
関連する問題