关于Hibernate出现illegal attempt to dereference collection..的错误处理

今天使用Hibernate查询某个实体时出现标题中所示的错误,百思不得其解,查阅资料后发现,这个问题是因为Hibernate的版本问题造成的,具体原因见这里

在我的项目中,两个实体类AppUser与AppRole,AppUser类中有一个List<AppRole>d的属性用来存放此用户的角色。我现在想要做的是通过AppRole的rname查询出这个权限下所有的AppRole。我定义了命名查询:

[codesyntax lang=”xml”]

  <query name="UserDao.findByRoleName">
        <![CDATA[
         select u
         from com.kaisir.tms.pojo.AppUser as u
         where u.AppRoles.rname=:rname
        ]]>
  </query>

[/codesyntax]

可是查询出现了标题中的错误,查阅资料,后期版本的Hibernate必须“显式”的指定子查询,不会再自动的添加隐含的查询了,故将定义修改如下:

[codesyntax lang=”xml”]

  <query name="UserDao.findByRoleName">
        <![CDATA[
         select u
         from com.kaisir.tms.pojo.AppUser as u inner join fetch u.appRoles r
         where r.rname=:rname
        ]]>
  </query>

[/codesyntax]

这样我显式的告诉Hibernate先去查询AppUser中的appRoles属性,然后再从属性中查询其rname为指定值的AppUser对象,这样问题就解决了 :)

Hibernate : could not load an entity

 

貌似接近一个月没有更新部落格了,总结这么长时间没更新的原因:

1)忙,真是忙。
2)WordPress后台实在是太慢,慢到等半天才能看到撰写的界面,6月份自己用java写了一个部落格,但是觉得有太多地方还不够完善了,所以就没有移植过来,再等等吧,忙完这阵可能就会清闲许多了。

说了一堆闲话,说说要写的内容,这两天项目中涉及到了Hibernate的操作,可是总在报以下两个错误:

1) could not load an entity: [com.kaisir.server.vo.User#1]
2) 关键字 ‘User’ 附近有语法错误。

因为hibernate相关的部分都是由MyEclipse生成的,从映射文件到vo,理论上是不会出错的,后来经过检查,发现出错原因在于“User”这个是Sql Server的关键字,Hibernate没智能到给关键字加上”[ ]”以示区分。