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

群里有朋友求解一个问题,高分求一条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%'

时间: 2025-01-20 13:57:41

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

系统学习hibernate之四 hibernate多对一关联映射

一.关联映射的本质: * 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用 <many-to-one>会在多的一端加入一个外键,指向一的一端,这个外键是由<many-to-one> 中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致 <many-to-one>标签的定义示例: * <many-to-one name="group" column="groupid"/>

hibernate多对一关联映射问题

问题描述 /*一级栏目类*/@Entity@Table(name="tb_biglb")publicclassBiglbBeanimplementsSerializable{privateintbgid;privateStringbgname;privateSet<SmlbBean>smlbs=newHashSet<SmlbBean>();@OneToMany(mappedBy="bglb",fetch=FetchType.EAGER)pub

【SSH系列】Hibernate映射 -- 多对多关联映射

     映射原理         在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张表中做一个关联,用第三张表来解决可能造成的数据冗余问题.今天这篇博文小编来简单的介绍一下hibernate中的多对多关联映射.        在某些系统中,一个用户可以有多个角色,一个角色也可以有多个用户,so,她们之

一口一口吃掉Hibernate(六)——多对多关联映射

       今天来说说Hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种.        首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就是典型的多对多关联的例子.而单向关联映射则是只能由A端去操作B端,B端不能操作A端的数据.而双向关联映射则是A,B两端都可以操作另一端的数据.       先说单向关联映射,实体类如下: /** * 学生类 * @author Longxuan * */ public c

hibernate多对多关联查询配置

问题描述 hibernate多对多关联查询配置 学生.课程.成绩三者 public class Student extends BaseModel { private static final long serialVersionUID = 1L; @Id @GenericGenerator(name = "idGenerator", strategy = "uuid") @GeneratedValue(generator = "idGenerator&q

Hibernate 多对多关联 中间表有多个字段如何配置

问题描述 例如 :学生 与课程之间是多对多关联,中间表不仅有学生表和课程表的主键,中间表还有其他字段(成绩等),该如何配置,用JPA如何设置,望大家指点指点| 解决方案 一个事例:LoginInfo.hbm.xml<hibernate-mapping><class name="com.ucit.ca.webApp.po.LoginInfo" table="CAS_USER_MODULE_INFO"><id name="lid&

hql语句-hql带多个条件查询报null错误,但是数据库能查到值

问题描述 hql带多个条件查询报null错误,但是数据库能查到值 String hql = "from Userinfo u where u.userName=? and u.userPassword=? and u.sysrole.roleCode='1101'"; Query query = this.getSession().createQuery(hql); query.setParameter(0, userName); query.setParameter(1, userP

vc++中如何实现条件查询?求教!!

问题描述 vc++中如何实现条件查询?求教!! 我做的条件查询的代码如下: try { _RecordsetPtr pRecordSet; pRecordSet.CreateInstance("ADODB.RecordSet"); pRecordSet->Open("SELECT * FROM zhuce where gangtongbanjing='%s'",(LPCSTR) _variant_t((IDispatch *)(((CYyxtApp*)AfxG

oracle从一张表中根据不同条件查询出两个结果 然后查出两个结果中相同的数据

问题描述 oracle从一张表中根据不同条件查询出两个结果 然后查出两个结果中相同的数据 这是表中数据 我用下面这种方法 select * from ((select * from SFFX_JGJPZ_DETAIL d where d.jgjpz_id=1) o), ((select * from SFFX_JGJPZ_DETAIL d where d.jgjpz_id=8) t) where o.platename=t.platename ; 查出来的结果对的 却在一行 怎么解决.. 解决方