2011-03-12 136 views
0

嘗試使用使用Hibernate 3.6和MySQL5.1選擇一個實體,但我不斷收到一個ClassCastException。Hibernate createQuery()拋出ClassCastException,Transformer沒有幫助

@Entity 
@Table(name = "USER") 
public class User { 
    @Id 
    @Column(name= "user_id") 
    private Long userId; 

    @OneToOne() 
    @JoinColumn(name="status_id") 
    protected UserStatusType userStatusType; 

    @OneToOne() 
    @JoinColumn(name="region_id") 
    protected Region region; 


@Entity 
@Table(name = "REGION") 
public class Region 
    @Id 
    @Column(name = "region_id") 
    private Long regionId 


@Entity 
@Table(name = "USER_STATUS_TYPE") 
public class UserStatusType 
    @Id 
    @Column(name = "type_id") 
    private Long typeId 

當試圖在的createQuery()我一直得到一個ClassCastException使用HQL:

session.beginTransaction(); 
User user = (User)session.createQuery(
    "from User u, UserStatusType ust, Region r " 
    + " where u.userId = ? and u.userStatusType.typeId = ust.typeId" 
    + " and u.region.regionId = r.regionId") 
    .setLong(0, 42L)      
    .uniqueResult(); 


java.lang.ClassCastException: 
[Ljava.lang.Object; cannot be cast to com.scd.dao.entity.User 

我嘗試使用setResultTransformer(Transformers.aliasToBean(User.class)),但是這給了我一個NullPointerException 。

不知道我在做什麼錯。

+0

你會好心接受你的問題的答案嗎?這就是它在stackoverflow上的工作原理。謝謝! – Falcon

回答

5

如果FROM子句包含若干實體,而你只需要其中的一個,在SELECT指定:

User user = (User)session.createQuery(
    "select u " 
    + "from User u, UserStatusType ust, Region r " 
    + " where u.userId = ? and u.userStatusType.typeId = ust.typeId" 
    + " and u.region.regionId = r.regionId") 
    .setLong(0, 42L) 
    .uniqueResult(); 

否則,你會得到實體的元組作爲Object[]

如果你確實需要渴望獲取的,而不是內部聯接,使用JOIN FETCH

User user = (User)session.createQuery(
    "from User u " 
    + "join fetch u.userStatusType join fetch u.region " 
    + " where u.userId = ?") 
    .setLong(0, 42L) 
    .uniqueResult(); 
+0

稍微更快,更詳細的答案:) – Falcon

+0

我得到了它的工作,thx,但爲什麼Hibernate執行此查詢的3個單獨的選擇語句?一個陳述會表現更好。我打開了跟蹤調試,並看到一個用戶,UserStatusType和Region的SELECT。 – user646584

+0

明白了,看到https://forum.hibernate.org/viewtopic.php?f=1&t=1010000&p=2442641#p2442641 – user646584

0

嘗試

session.beginTransaction(); 
User user = (User)session.createQuery(
    "select u from User u, UserStatusType ust, Region r " 
    + " where u.userId = ? and u.userStatusType.typeId = ust.typeId" 
    + " and u.region.regionId = r.regionId") 
    .setLong(0, 42L)      
    .uniqueResult(); 
+0

這工作,以消除ClassCastException,thx,但我看到,Hibernate使用3個獨立的SELECT語句來構建實體;對於那些應該需要單個SELECT的東西來說,這是太多的數據庫命中。我如何強制它只打一次數據庫? – user646584

+0

請查看,https://forum.hibernate.org/viewtopic.php?f=1&t=1010000&p=2442641#p2442641 – user646584

1

這樣做的最好辦法是:

Query query = session.createQuery(queryString).addEntity(<Class Name>.class); 
<Class Name> obj = (<Class Name>)query.uniqueResult(); 

最後,爲我工作嘗試它...

0

您可以通過在查詢結尾添加.addEntity(User.class)來解決此問題。例如:

session.beginTransaction(); 
User user = (User)session.createQuery(
    "from User u, UserStatusType ust, Region r " 
    + " where u.userId = ? and u.userStatusType.typeId = ust.typeId" 
    + " and u.region.regionId = r.regionId") 
    .setLong(0, 42L)      
    .uniqueResult().addEntity(User.class); 
相關問題