0

Hibernate 3.6 と MySQL5.1 を使用してエンティティを選択しようとしていますが、ClassCastException が引き続き発生します。

@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() で HQL を使用しようとすると、ClassCastException が発生し続けます。

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 が発生しました。

私が間違っているのかわかりません。

4

4 に答える 4

5

FROM句に複数のエンティティが含まれており、そのうちの 1 つだけが必要な場合は、次のように指定します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(); 
于 2011-03-12T21:27:08.663 に答える
1

これを行う最良の方法は次のとおりです。

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

最後に、試してみてください...

于 2012-06-07T04:15:19.483 に答える
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);
于 2012-10-16T12:31:53.973 に答える
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();
于 2011-03-12T21:28:05.183 に答える