Hibernate hql ---in操作符的使用

List<Integer> idList = new ArrayList<Integer>();
idList.add(1);
idList.add(2);

则HQL查询条件可以为:

String hql = "from Tab o where o.id in (:id)";  
 
Query q = ……;

q.setParameterList("id", idList);



一个学科表(Field),一个用户表(User),多对多关系。

学科表有两个字段,id和descripiton,用户表有众多字段,不罗列了

Field中有SET集合users,User中有SET集合fields;

现在要查掌握id like '520%'的女性用户

我这样写的:

from User u,Field f where u.gender='m' in (select f.users from Field where f.id like '520%')

持续报错!

我的项目代码中恰好有一个多对多的关联映射的类:User(用户)和Role(角色),其中,User类中有 roles集合,而Role类中有users集合。我用我的代码测试了一番。

首先写了下面这句:

select user from User user where user.sex='男' and user in (select role.users from Role role where role.id>5)

这样不行,报错。原因是,Hibernate的HQL语句中的“in条件”句如:x  in(‘a’,’b’,’c’) ,要求的是x是(‘a’,’b’,’c’)中的一个元素,而select role.users这样查出来的是集合的集合 ,它内部的元素应该是一个集合:set<user> in (select role.users…),而不是一个对象: user in (select role.users…)。

可惜的是HQL语句没有set<user> in (select role.users….)这样的子句,后来,查了一下 Hibernate的参考文档,得到解决方法。原来,Hibernate的HQL语句中的“in条件”中,可加入” elements”关键词,即上面的查询语句变成:

select user from User user,Role role where user.sex='男' and user in elements (role.users) and role.id>5

这样就行了。

不过还有一个小问题,就是这样查询出来,会出现许多重复记录,原因是查询出的每一个符合的role 后,会通过role.getUsers()查出users集合,这样,当然就可能出现有几个role拥有相同的user的现象。 很容易解决,加多一个“distinct ”关键词就行。

select distinct  user from User user,Role role where user.sex='男' and user in elements(role.users) and role.id>5

好了,解决了。hql语句如下:

select distinct u from User u,Field f where u.gender='m' and u in elements(f.users) and f.id like '520%'


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值