hibernate的hql查询
1.概念介绍
1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句。
2.HQL是Hibernate Query Language的简写,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,更加面向对象的封装,更加灵活,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式
它的书写形式和sql几乎一样,下面就来体会下
2.单表查询
针对一个表的查询, from A , hibernate会把A翻译为对相应的实体
2.1获取对象的所有属性:
String hql="from User u where u.userID=?"
它的的返回形式是一个user对象
2.2获取对象的一个属性:
String hql="select u.name from User u where u.userID = ?";
它的返回形式是: List<String> users, 属性是String类型, 因此List的泛型,会自动封装为属性的类型
2.3获取部分属性,返回对象
第一步: 在User实体中,添加构造函数
public User(Integer age, String name) {}
第二步: 写hql
String hql = "select new User ( u.name,u.age ) from User u where u.userID > ?";
通过new的方式,可以达到目的,它的返回形式是: List<User> users
3.关联表查询: 关联的是id
下面是one2one和one2many的例子
3.1 One2One
user和order是一对一的关系,User实体类中有属性 Order order
以User的id为条件查
String hql="from User u left join u.order o where u.id>?";
1.left join u.order , 没有on 关键字, sql 翻译自动为关联u.xxx left out join o.id
2.with关键字 相当于sql中的on
3.它的返回形式是:List<Object[]> 对象数组的集合, 每一个数组有两个元素,即 object[]{user,order}
以Order的id为条件查
String hql="from User u where u.order.id>?";
u.order.id 是hibernate关联对象间的导航特性
现在我需求是, 既然order是User的一个属性, 我想把Order封装在User中,即object[]{user}
hql的变化有三点: select u ; 加入fetch 关键字; 为了防止有重复数据,加入disrinct关键字
String hql="select distinct u from User u left join fetch u.orders where u.id>?";
它的返回形式是:List<Object[]> 对象数组的集合, 数组的数据机构是 : object[]{user},通过getOrders()获取关联的对象
distinct和fecch有这么神奇的效果,看了下面的分析,肯定明白
查询出的数据如下,只展示id,其余数据省略
| UserId | OrderID | |
| 1 | 1 | |
| 1 | 2 |
对上面的数据它是如何封装的呢?
1>第一行数据 : 用户id为1
第一步: User user = new User();存取用户信息。
第二步: Order order1=new Order(),存取order信息,并将order1, user.setOrders(...)
第三部: 将user存入List<User> users, users.add(user) 2>第二行数据 : 用户id依然为1
第一步: 发现用户id未改变,,则继续使用user.
第二步: 订单id改变,则 Order order2 = new Order(),存取order信息,并将order2存入user.
这个时候,同一个user拥有的两个order
第三步: 将user存入List<User> users, users.add(user1); 3>最终: List<User> users;
3.2 one2many
user和order是一对多的关系,User实体类中有属性 Set<Order> orders
Ordre实体中有关系属性: User user
以orders的id为条件去查
String hql="from User u left join u.orders o where o.id>?";
注意:
必须left join u.orders,这是显示连接 orders , 这是和one2one不同之处
4.关联表查询: 关联的是普通属性
A表中有xx字段, B表中也有xx字段
string hql = "select a from A a ,B b where a.xx=b.xx";
5.子查询
Order中的属性: Long userId , 是 User的 逻辑外键
String hql="from User u where u.id >"
+ "(select o.userId from Order o where o.id =1)";
子查询必须放在where关键字后面,必须用()括起来
原因: from字句中的实体对象,必须在Hibernate配置文件中有明确的配置
hibernate的hql查询的更多相关文章
- Hibernate之HQL查询
一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...
- Hibernate五 HQL查询
HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...
- Hibernate 的hql查询简介【申明:来源于网络】
Hibernate 的hql查询简介[申明:来源于网络] Hibernate 的hql查询简介:http://blog.csdn.net/leaf_130/article/details/539329 ...
- hibernate的hql查询语句总结
这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Class ...
- Hibernate(九)HQL查询
一.Hibernate提供的查询方式 OID查询方式:主键查询.通过get()或者load()方法加载指定OID的对象查询结果为一个 HQL查询方式:通过Query接口使用HQL语言进行查询 QBC查 ...
- Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询
在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...
- Hibernate 、Hql查询和Criteria查询
HQL查询: public Object query(String name){ Session s=null; try{ s=HibernateSessionFactory.getSession() ...
- Hibernate之HQL查询的一些例子
Hibernate配备了一种非常强大的查询语言,就是HQL(hibernate query language),HQL看上去很像sql,但只是语法结构上相似,HQL是一种面向对象的查询,他可以理解继承 ...
- Hibernate 中Hql 查询中间表的用法
案例简述: 项目中存在User 用户表 和 Role 角色表 它们之间是多对多的关系 在User类定义中 使用hibernate注解 //角色列表 @ManyToMany(targetEntity = ...
随机推荐
- PHP读取超大文件的实例代码
数据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机 去年年底的各种网站帐号信息的数据库泄漏,很是给力啊,趁机也下载了几个数据库,准备学学数据分析家来分析一 ...
- PhpSms 稳定可靠的php短信发送库
可能是目前最聪明.优雅的PHP短信发送库了.从此不再为各种原因造成的个别短信发送失败而烦忧! phpsms的任务均衡调度功能由toplan/task-balancer提供. GitHub地址:http ...
- java基础算法之冒泡排序
接触冒泡算法还是大一了,学习C语言的冒泡算法.现在唯一记得就是冒泡与选择了.出来刚刚工作的时候觉的算法基本没撒用处,现在发现这些都是很好的基础.因此自己也准备重新拾起这些知识. 冒泡排序 泡排序是一种 ...
- WinCE项目应用之虚拟仪器(VI)
虚拟仪器技术就是利用高性能的模块化硬件,结合高效灵活的软件来完成各种测试.测量和自动化的应用.虚拟测量仪器(VI)概念由美国国家仪器公司NI(National Instruments)提出,并引发了传 ...
- Java虚拟机详解----JVM常见问题总结
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- tyvj[1087]sumsets
描述 正整数N可以被表示成若干2的幂次之和.例如,N = 7时,共有下列6种不同的方案:1) 1+1+1+1+1+1+12) 1+1+1+1+1+23) 1+1+1+2+24) 1+1+1+4 ...
- JS中NULL和Undefined的区别
NULL是表示一个”无“的对象,转换成数值为0:undefined是一个“无”的原始值,转为数值为NaN: 当声明的变量还未被初始化时,变量的默认值为undefined: null用来表示尚未存在的对 ...
- windows live Writer test
package com.newegg.shopping.util.listener; import javax.servlet.http.HttpSessionAttributeListener; i ...
- MongoDB JAVA API Filters
Filters 该过滤器类为所有的MongoDB的查询操作静态工厂方法.每个方法返回BSON类型,又可以传递给期望一个查询过滤器的任何方法的一个实例. eq:匹配等于指定值的值.gt:匹配大于指定值的 ...
- 推薦使用 Microsoft Anti-Cross Site Scripting Library v3.1
原文链接:http://blog.miniasp.com/post/2009/09/27/Recommand-Microsoft-Anti-XSS-Library-V31.aspx 雖然我之前已經寫過 ...