role 表
loginuser表 他们是多对多的关系
还有dept表 和loginuser是一对多的关系
我想要查询 某些部门下 的某些角色下的 所有用户
在数据库中的查询语句是这样
select * from login_user u , dept d on d.did=u.did and d.did in (1,2) and u.isteacher=1 and u.userid in (select userid from user_role ur where ur.roleid in (1,2))
但是在 hql中 则会报错
String hql="select u from LoginUser u , Dept d where d.did=u.dept.did and d.did in (1,2) and u.userid in (select u2.userid from LoginUser u2 , u2.roles r where r.roleid in ("+ roleids+") ";
报错:
00:38:37,464 ERROR org.hibernate.hql.PARSER:56 - line 1:225: expecting CLOSE, found 'null'
开始以为hql不支持from 后的 in 子查询
或者不支持多对多关系的子查询
后来一查, 对于多对多里面的 set集合可以用 u in elements(r.loginUsers)
来取。
修改后的sql语句
String hql="select u from Dept d, Role r ,LoginUser u where d.did=u.dept.did and d.did in ("+deptids+") and u in elements(r.loginUsers) and r.roleid in("+roleids+")";
分享到:
相关推荐
在本话题中,我们将探讨数据库设计的基础,特别关注SELECT语句、子查询以及语句嵌套这三个核心概念。 首先,数据库设计不仅仅是创建表格,更重要的是理解和分析业务需求,以构建一个能够支持高效数据存储、检索和...
表子查询是指返回的结果集是 N 行 N 列,例如 `SELECT * FROM article WHERE (uid, username) IN (SELECT uid, username FROM user WHERE status=1)`。这种类型的子查询通常用于 EXISTS、IN 等操作符的右侧。 在 ...
5、子查询 6、合并查询结果 7、为表和字段取别名 8、使用正则表达式查询 什么是查询? 怎么查的? 数据的准备如下: [sql] view plain copy create table STUDENT( STU_ID int primary KEY, STU_NAME char(10) ...
在SQL中,视图和子查询是两种非常重要的概念,它们在数据管理和分析中起着至关重要的作用。本文将详细探讨这两个主题,并结合提供的练习题目给出解答。 首先,视图是一种虚拟表,它是由一个或多个SQL查询结果组成的...
然而,当子查询涉及到大型数据集或者复杂的逻辑时,其执行效率可能会降低,因为这通常需要在内存中创建临时表来存储中间结果。例如,要找出没有订单记录的客户,可以使用如下子查询: ```sql SELECT * FROM ...
IN子查询与ANY关键字相似,它将子查询的结果集作为条件范围。例如: ```sql select * from xxx where col in (select value from yyyy); ``` 这将返回主查询中col值存在于子查询结果集中的记录。 4. **EXISTS ...
子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用。MySQL 支持 SQL 标准要求的所有子查询格式和操作,也扩展了特有的几种特性。 子查询没有固定的语法,一个子查询的例子如下: SELECT *...
当执行包含IN子查询的SQL语句时,例如 "SELECT * FROM t1 WHERE x1 IN (SELECT x2 FROM t2 WHERE x3 = xxx)",MySQL优化器会将执行计划优化,首先执行子查询,将结果物化成临时表,并在这个临时表上建立索引。...
上述案例中涉及的查询主要涵盖了多对多关系、子查询和聚合函数等概念,这些都是数据库设计和管理的基础知识。 1. **多对多关系**: 在案例中,学员、老师、课程之间存在典型的多对多关系,通常通过一个中间表(如...
它不同于其他单表查询,因为它不是直接对查询表进行行列筛选,而是将查询结果分组并进行聚合操作。GROUP BY关键字是实现分组查询的关键,它将查询结果分组,并将具有相同分组值的元组合并成一个组。 为了简单地阐明...
在统计分析中,子查询常用于先计算出中间结果,然后再基于这些结果进行进一步的处理。 ```sql SELECT * FROM ( SELECT 列1, COUNT(*) AS cnt FROM t1 GROUP BY 列1 ) AS sub UNION SELECT '总计', SUM(cnt) FROM ...
在这个例子中,子查询 `(SELECT c.order_id FROM `case`)` 用来找出所有存在于 `case` 表中的 `order_id`,然后主查询使用这些 `order_id` 来过滤 `orders` 表的记录。 除了JOIN和子查询,还有其他跨表查询技术,如...
- **外层查询**:外层查询从`职工`表中选出那些不在子查询结果中的员工信息。 - **知识点**: - NOT IN关键字的用法。 - 单表查询与子查询的结合。 3. **题目(5)**:此题目要求查询出至少参加了任意一个...
子查询可以嵌套在SQL语句中提供临时结果集,而连接(JOIN)操作用于从多个表中检索数据。优化这两类操作通常包括: - 对于子查询,应当尽可能转换为JOIN操作,尤其是在子查询结果集较大时,因为部分数据库系统对JOIN...
在进行子查询时,EXISTS通常比IN更高效,因为它一旦找到匹配项就会停止搜索。例如,`WHERE EXISTS(SELECT 1 FROM b WHERE num = a.num)`比`WHERE num IN (SELECT num FROM b)`更快。 ### 11. 选择正确的列类型 ...
7. **子查询**:子查询是在一个查询语句中嵌套另一个查询语句,用于获取中间结果。例如,查询与"张雪"教师职称相同的教师信息,可以使用子查询来找出"张雪"的职称,然后在主查询中使用这个信息。ANY、IN和ALL谓词...
6. **子查询**:子查询是在主查询内部的查询,可以用于设置条件或者获取中间结果。例如,`SELECT * FROM table_name WHERE column1 IN (SELECT column2 FROM another_table);`将返回table_name中column1值在another_...
在进行子查询时,使用 `EXISTS` 替代 `IN` 通常更为高效。 #### 14. 避免使用性别等固定值进行过滤 如果查询条件涉及性别等固定值,应当考虑是否真的有必要这样做。 #### 15. 优化INSERT和UPDATE操作 在执行大量的...
2. 避免子查询:子查询可能导致性能下降,尝试使用JOIN操作替代,或者通过临时表存储中间结果。 3. 减少数据返回量:只请求必要的字段,避免使用SELECT *,并考虑使用LIMIT限制返回行数。 4. 使用EXISTS而非IN:当...
查询表的时候,有时候中间表需要重复使用,这些子查询被重复查询调用,不但效率低,而且可读性低,不利于理解。那么公式表表达式可以解决这个问题。 我们可以将公式表表达式(CET)视为临时结果集,在select、...