2017-05-28 294 views
0

我想加入3張表以獲得所需的信息,使用entityManager.createQuery如何從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的bean。

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

getters() & setters() 
} 

但當我試圖使用,而不是ListObject[]ListUserDetails它說ClassCastException

如何使用自定義bean獲取/轉換返回的對象?

+0

嗯,我不知道答案,但使用聯接不是更好嗎? – 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(登錄ID,EMAILID,用戶id,名字,密碼,phoneNunber,roleTypeId)

或者你可以使用你的代碼,然後編寫一個轉換器,將一個對象數組轉換爲UserDetails

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

我試過第一個,但它說: 錯誤[org.hibernate.hql.internal.ast.ErrorCounter](默認任務-30)無法找到適當的類構造函數 秒1將肯定工作。 – Joe

+1

@Joe你需要添加一個構造函數到'UserDetails' –

+0

對不起,我忘了。在查詢中選擇參數與字段順序相同的構造函數,因此** UserDetails(loginId,emailId,firstName,...)** –

1

您可以使用結果轉換器。結果轉換器是一個休眠功能(不是JPA)。所以你需要使用Hibernate的SessionQuery

事情是這樣的:

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別名:u.loginId as loginId和相應的屬性在UserDetails

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

相關問題