2011-03-12 69 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); 
相关问题