Hibernate createQuery () выбрасывает ClassCastException, Transformer не помогает - PullRequest
0 голосов
/ 13 марта 2011

Попытка ВЫБРАТЬ сущность, используя 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

При попытке использовать HQL в createQuery () я получаю исключение 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 ]

5 голосов
/ 13 марта 2011

Если предложение 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(); 
1 голос
/ 07 июня 2012

Лучший способ сделать это:

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

Наконец-то у меня получилось попробовать ...

0 голосов
/ 16 октября 2012

Вы можете решить эту проблему, добавив .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);
0 голосов
/ 13 марта 2011

1001 * попробовать *

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();
...