随笔-42  评论-578  文章-1  trackbacks-0

群里有朋友求解一个问题,高分求一条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.blogjava.net/rongxh7(心梦帆影JavaEE技术博客)
    

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

评论:
# re: Hibernate多对多关联映射的HQL中的in条件查询问题 2009-06-22 15:28 | 123
select USER_ROLE_TABLE ur where ur.user.sex='女' and ur.role.id like
'520%'  回复  更多评论
  
# re: Hibernate多对多关联映射的HQL中的in条件查询问题 2009-06-23 10:10 | 找个美女做老婆
Java乐园交流学习社区: http://www.javaly.cn

QQ群:28840096  回复  更多评论
  
# re: Hibernate多对多关联映射的HQL中的in条件查询问题 2009-07-04 16:03 | dikar
select distinct user
from (
select user
from User user
where user.sex='男'
) tempUser , Role role
where role.id>5
and tempUser.id=role.user.id

其实一般情况下的in最好用临时表的思想替换掉 ,然后连接的字段最好是有索引的  回复  更多评论
  
# re: Hibernate多对多关联映射的HQL中的in条件查询问题 2014-01-07 14:41 | 浏览
这篇文章帮了大忙,谢谢  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: