群里有朋友求解一个问题,高分求一条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. BZOJ3196 Tyvj1730 二逼平衡树 【树套树】 【线段树套treap】

    BZOJ3196 Tyvj1730 二逼平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名 ...

  2. 洛谷 P1098 字符串的展开

    题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母或数 ...

  3. winform 多线程中ShowDialog()无效的解决办法

    在使用Winform开发的过程,不可避免的要使用多线程,其中会在多线程中会调用窗口的ShowDialog方法,但实际上并不是模式窗口. private void Form1_Load(object s ...

  4. java少包汇总

    1.在下载使用javax.mail的jar包时候,注意: 有的jar没有包含sun的实现,只包含了api,这类jar名称通常为javax.mail-api-x.x.x.jar,在使用smtp协议发邮件 ...

  5. Codeforces Round #205 (Div. 2)C 选取数列可以选择的数使总数最大——dp

    http://codeforces.com/contest/353/problem/C Codeforces Round #205 (Div. 2)C #include<stdio.h> ...

  6. 使用FileZilla连接Linux

      FileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能.可控性.有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个方便高效的FTP ...

  7. Jquery each循环中中断

    在each代码块内不能使用break和continue,要实现break和continue的功能的话,要使用其它的方式 break----用return false; continue --用retu ...

  8. 小小的学习FPGA建议

    学习FPGA,一点小小的 建议或者总结分享. 语法层面搞懂阻塞和非阻塞语句,以及Verilog语言的时序描述方法,把自己想象成编译器,尝试去编译自己写的Module,不断总结自己设计的逻辑会综合出怎么 ...

  9. POJ1745动态规划

    Divisibility Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11622   Accepted: 4178 Des ...

  10. 分布式事务之:TCC几个框架的测试情况记录

    国内主要的开源TCC分布式事务框架包括 框架名称 Github地址  star数量  tcc-transaction  https://github.com/changmingxie/tcc-tran ...