DetachedCriteria分页中有重复记录的问题

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实现需求的做法。如果哪位有解决办法,请分享一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值