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

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

  1. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  2. Hibernate 多对多关联映射, 中间表加查询条件

    package com.coracle.yk.xpo.po.base; import java.util.Date; import java.util.HashSet; import java.uti ...

  3. hibernate的多对多关联映射

    在我们实际项目中,多对多的情况也时长存在,比如最常见的就是系统管理的五张表,如下面的一个结构: 在本文学习hibernate多对多关联映射的实验中我简单的写几个字段,达到学习目的即可. 1.多对多的关 ...

  4. 【Hibernate框架】关联映射(一对多,多对一)

    根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...

  5. (Hibernate进阶)Hibernate映射——多对多关联映射(八)

    多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...

  6. Hibernate(六)——多对多关联映射

    前面几篇文章已经较讲解了三大种关联映射,多对多映射就非常简单了,不过出于对关联映射完整性的考虑,本文还是会简要介绍下多对多关联映射. 1.单向多对多关联映射 情景:一个用户可以有多个角色,比如数据录入 ...

  7. hibernate之关于使用连接表实现多对一关联映射

    [Hibernate]之关于使用连接表实现多对一关联映射 在我们项目使用中採用中间表最多的一般就是多对一,或者是多对多,当然一对一使用中间表也是能够的,可是这样的几率通常少之又少!所以这里重点介绍多对 ...

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

    今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种. 首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就 ...

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

         映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...

随机推荐

  1. Codeforces 17E Palisection 【Manacher】

    Codeforces 17E Palisection E. Palisection In an English class Nick had nothing to do at all, and rem ...

  2. {Notes}{LaTeX}{enumerate}

    \usepackage{enumerate} \begin{enumerate}{(1)} \setcounter{enumi}{2} % begin with 2 \item first \item ...

  3. win32 去掉窗口边框

    参考:http://www.blitzbasic.com/Community/posts.php?topic=67222 Strict Graphics 320, 200 SetClsColor 0, ...

  4. dda的fpga实现(转载)

    The general approach using DDAs will be to simulate a system of first-order differential equations, ...

  5. 电源lc滤波及单点接地(转载)

    1.在一个高速数字电路设计里面,看到在电源部分进行了如下的处理.不过怎么都不能理解,如果说1uF和0.1uF电容并联,这块处理是一个经验值.那么前面的LC滤波参数,参数又是如何确定的?DVDD-in输 ...

  6. 自定义vue全局组件use使用(解释vue.use()的原理)

    我们在前面学习到是用别人的组件:Vue.use(VueRouter).Vue.use(Mint)等等.其实使用的这些都是全剧组件,这里我们就来讲解一下怎么样定义一个全局组件,并解释vue.use()的 ...

  7. webpack libray 参考例子

    备注:   使用webpack 进行模块导出,方便进行通信 1. 项目初始化 ├── main.js ├── package.json ├── show.js ├── webpack.config.j ...

  8. tar 打包处理文件

    基本格式:tar [Options] file_archive //注意tar的第一参数必须为命令选项,即不能直接接待处理文件 Option是由三部分组成,分别是操作类型(创建,查看,解压),压缩处理 ...

  9. 基于标准库的string类实现简单的字符串替换

    感觉基本功还是不扎实,虽然能做些程序但是现在看来我还是个初学者(primer),试着完成习题结果还得修修改改. 废话不多说,实现功能很简单,<C++ Primer>9.5.2节习题. // ...

  10. linux命令之awk

    简介 awk命令的名称是取自三位创始人Alfred Aho .Peter Weinberger 和 Brian Kernighan姓名的首字母,awk有自己的程序设计语言,设计简短的程序,读入文件,数 ...