userinfo表和roleinfo表,二者为多对多关系,通过关联表userinfo_roleinfo连接。
通过public List <UserInfo> getInfos(int firstResult)方法获取要在一页中显示的数据。
userinfo数据: userinfo_roleinfo数据: roleinfo数据:
userId username userId roleId roleId roleName
1 user1 1 1 1 role1
2 user2 2 1 2 role2
3 user3 3 1
4 user4 4 1
5 user5 1 2
6 user6 5 1
使用DetachedCriteria
-
Java code
-
public List < UserInfo > getInfos( int firstResult){ log.debug( " finding specified UserInfo instances " ); try { DetachedCriteria criteria = DetachedCriteria.forClass(UserInfo. class ) return getHibernateTemplate().findByCriteria(criteria, firstResult, 3 ); } catch (RuntimeException re) { log.error( " find failed " , re); throw re; } }
由于是left outer join,所以执行getInfos(0)有重复数据。得到的三个UserInfo的实例id为:1,1,2,前两个重复。
加上setResultTransformer(DetachedCriteria.DISTINCT_ROOT_ENTITY),后去掉了重复结果,但只得到两个UserInfo的实例。
这种情况下分页会出现问题。
改用下面的方法就没有问题了:
-
Java code
-
public List < UserInfo > getInfos( int firstResult){ log.debug( " finding specified UserInfo instances " ); try { String queryString = " from UserInfo " ; Query query = this .getSession().createQuery(queryString); query.setFirstResult(firstResult); query.setMaxResults( 3 ); return query.list(); } catch (RuntimeException re) { log.error( " find failed " , re); throw re; }
执行getInfos(0),得到的是id为1,2,3的三个UserInfo实例。
但是,这种方法会执行一堆的sql语句,很恐怖。
暂时没有发现用DetachedCriteria实现需求的做法。如果哪位有解决办法,请分享一下