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 = ...
随机推荐
- Linux Gitlab
一.简介 GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源 ...
- PHP读取超大文件的实例代码
数据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机 去年年底的各种网站帐号信息的数据库泄漏,很是给力啊,趁机也下载了几个数据库,准备学学数据分析家来分析一 ...
- 如何在TFS中恢复系统默认查询”已指派给我”的设置(TFS 2013)
故事是这样开始的,一天开发人员求助说,在浏览器中修改了系统默认的工作项查询"已指派给我"的后,发现这个查询每次都提示超时,并且没有办法恢复到初始的设置状态,因为出现超时提示以后,查 ...
- 详细解密FineReport中的报表执行过程
在报表开发工具FineReport中,报表的执行过程大体可分为两步:1.报表计算:2.页面转换. 报表计算过程:先读取我们的sql语句,将完整的sql语句传至数据库服务器,由数据库返回数据给报表服务器 ...
- 理解 OpenStack + Ceph (2):Ceph 的物理和逻辑结构 [Ceph Architecture]
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
- Unity 5 WebGL vs Web Player
起原 Unity5.3中看到Web Player未来将到被取消,根据Unity官方blog中称Unity5.4中将会移除web player. 本文从我知道的知识比较一下webPlayer和WebGL ...
- [No000036]操作系统Operating Systems系统调用的实现System_Call
实现一个whoami 系统调用 系统调用的直观实现 问题+直观想法… 用户程序调用whoami, 一个字符串"systemcall "放在操作系统中(系统引导时载入) ,取出来打印 ...
- Nginx 启用 https
在nginx.conf中增加新server配置 server { listen ; server_name www.some.com; ssl on; ssl_certificate sslkey/s ...
- 01Spring_基本jia包的导入andSpring的整体架构and怎么加入日志功能
1.什么是Spring : v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:u ...
- 【WPF】TextBox样式重写注意事项
1.普通控件重写需要添加一行 <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="C ...