java hql in_Hibernate多对多关联映射的HQL中的in条件查询问题

文章详细讲述了在Hibernate中处理多对多关联映射时,如何使用HQL进行in条件查询。作者通过实际示例解释了在HQL中,当尝试使用`in`查询集合时出现的错误,并提供了解决方案,即使用`elements`关键字来避免集合的集合导致的错误。同时,还提到在查询结果可能存在重复记录的情况下,可以使用`distinct`关键字去除重复。最后给出了具体的HQL语句示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

群里有朋友求解一个问题,高分求一条HQL多对多查询语句 。

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

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

4f1150b881333f12a311ae9ef34da474.pngField中有SET集合users 

4f1150b881333f12a311ae9ef34da474.pngUser中有SET集合fields 

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

4f1150b881333f12a311ae9ef34da474.png我这样写的: 

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

4f1150b881333f12a311ae9ef34da474.png持续报错!

我的项目代码中恰好有一个多对多的关联映射的类: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 in (select role.users…),而不是一个对象: user in (select role.users…)。

可惜的是HQL语句没有set 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

好了,解决了。那位CSDN中的朋友提的问题也解决了,它的hql语句如下:

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

本文原创,转载请注明出处,谢谢!http://www.blogjava.net/rongxh7(心梦帆影JavaEE技术博客)

posted on 2009-06-21 20:11 心梦帆影 阅读(11736) 评论(4)  编辑  收藏 所属分类: Hibernate

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值