快速业务通道

Hibernate多对多关联映射的HQL中的in条件查询问题 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

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

时间:2011-09-18 blogjava 心梦帆影

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

问题描述见 http://topic.csdn.net/u/20090621/16/4eac6fe0-bf3e-422e-a697-f7584732f66e.html, 摘要如下:

一个学科表(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

好了,解决了。那位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.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号