2017-05-28 4 views
0

entityManager.createQueryを使用して必要な情報を取得するために3つのテーブルを結合しようとしています。JPA EntityManagerからカスタマイズされたbeanとして返されたオブジェクトを取得する方法

コードlittlepetは、次のように:

List<Object[]> o=entityManager.createQuery("SELECT u.loginId,ui.emailId,u.userId,ui.firstName,up.password,ui.phoneNunber,u.roleTypeId" + " From Users as u,UserInfo ui, UserPassword as up where u.userId = up.userId " + "AND u.userId=ui.userId").getResultList(); 

私は上記の返されたフィールドUserDetailsと豆を持っています。

public class UserDetails 
{ 
    String LoginId; 
    String Email; 
    String UserId; 
    String FirstName; 
    String Password; 
    String Mobile; 
    String RoleTypeId; 
    int Status; 

getters() & setters() 
} 

しかし、私は代わりにObject[]ListUserDetailsListを使用しようとしています、それはClassCastExceptionを言います。

返されたオブジェクトをカスタマイズされたbeanで取得/変換する方法は?

あなたは、このように UserDetails(ログインID、EMAILID、userIdを、firstNameという、パスワード、phoneNunber、roleTypeId)

、フィールドがクエリで選択されているのと同じ順序でパラメータを持つコンストラクタを持っている必要があり

+0

うーんI答えは分かりませんが、結合を使用する方がよいでしょうか? – niceman

答えて

2
List<UserDetails> o=entityManager.createQuery("SELECT new package.UserDetails(u.loginId,ui.emailId,u.userId,ui.firstName,up.password,ui.phoneNunber,u.roleTypeId)" + " From Users as u,UserInfo ui, UserPassword as up where u.userId = up.userId " + "AND u.userId=ui.userId").getResultList(); 

または、あなたのコードを使用して、オブジェクトの配列をに変換するコンバータを書くことができます。UserDetails

List<Object[]> retrievedObjects = //yourCode. 
for (Object[] objs : retrievedObjects) { 
     //write convert method which populates **UserDetails** fields from the objects. 
     UserDetails ud = convert(objs); 
} 
+0

私は最初の1を試しましたが、それは言う: ERROR [org.hibernate.hql.internal.ast.ErrorCounter](デフォルトのタスク-30)クラスの適切なコンストラクタを見つけることができません 2番目の1は間違いなく動作します。 – Joe

+1

@Joeあなたは 'UserDetails'にコンストラクタを追加する必要があります –

+0

申し訳ありませんが、私は忘れました。フィールドと同じ順序のパラメータを持つコンストラクタがクエリで選択されます。** UserDetails(loginId、emailId、firstName、...)** –

1

結果トランスフォーマを使用できます。結果トランスフォーマーは休止状態(JPAではなく)です。したがって、HibernateからSessionまたはQueryを使用する必要があります。このような

何か:

List<UserDetails> result = entityManager.createQuery(
    "SELECT u.loginId as loginId, ui.emailId as emailId ..." 
).unwrap(org.hibernate.query.Query.class) 
.setResultTransformer(new AliasToBeanResultTransformer(UserDetails.class)) 
.list(); 

あなたはHQLで別名持っている必要があります:UserDetailsu.loginId as loginIdと対応するプロパティを:変圧器の

class UserDetails 
{ 

    private String loginId; 

    public String getLoginId() { 
    return loginId; 
    } 

    public void setLoginId(String loginId) { 
    this.loginId = loginId; 
    } 

} 

例: http://jpwh.org/examples/jpwh2/jpwh-2e-examples-20151103/examples/src/test/java/org/jpwh/test/querying/advanced/TransformResults.java

関連する問題