在Hibernate的实际运用中遇到几个小问题。通过查看Hibernate的官方帮助获得了解决。现总结一下。
一、 多对多关系的查询问题
用户(TUser)和角色(TRole)存在多对多的关系:一个用户可以拥有多个角色,而一个角色可以有多个用户。显然这个时候会采用多对多的映射,用户(TUser)和角色(TRole)之间通过一个中间表进行关联。这个时候如果要获取特定角色的所有用户,最简单的方式当然是
TRole.getUsers()
这种方式会获取该角色的所有用户,用户很多以至于要分页现实信息,那么这个时候肯定就不行了。这时可以采用下面这种方式:
//
其中"Order by this.id"可以用别的过滤条件,this.id对应的是TUser的id
// 按TUser的id排序,选取前5个用户
session.createFilter(role.getUsers(), " Order by this.id " ).setFirstResult( 0 ).
setMaxResults( 5 ).list();
// 按TUser的id排序,选取前5个用户
session.createFilter(role.getUsers(), " Order by this.id " ).setFirstResult( 0 ).
setMaxResults( 5 ).list();
二、 集合类的排序问题
集合类排序其实有好几种方法,在官方参考中写得很清楚。我尝试用了其中一种:在Set中增加order-by属性。这里要注意的是对应的Java类必须用LinkedHashSet实例化(对应JDK5.0来说,相信没什么太大的理由是用低版本的jdk吧)。
三、 字符串函数substring()
substring() 会翻译成相应数据库的 substring 函数吧,这是我猜的,我只在 sqlserver 2000 下 做过测试。其用法是 substring(expression, start, length) : expression 对应 POJO 类的字段, 而 start 是起始位置(从 1 开始), length 为截取字符串长度。这里 start 很奇怪,如果不是 从正整数开始 (>0) 而是从 0 开始,那么截取字符串的长度则是 length-1 。这肯定是 sql server 的问题了。<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>