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 = ...
随机推荐
- maven项目下jsp文件中el表达式失效问题
本来是为了写个springmvc的小demo,雏形搭建起来后想起来做成maven的好了,就重新建的maven项目,坑就从这里开始了... maven创建web项目默认使用的是web 2.3版本,web ...
- Book LIst
Go ahead. Linux APUE Linux Kernel Development 鸟哥的linux私房菜 基础篇 鸟哥的linux私房菜 服务器篇 Network Computer Netw ...
- pyenv 使用简介
pyenv 是一个 python 版本管理工具,可以方便用户在不同的 python 版本间切换,例如我的电脑里默认的 python 是 2.6, 但我还想装 2.7 3.5 等.另有一个名为 pyen ...
- u3d_shader_surface_shader_5
CubeMap 的实现 参考: http://blog.csdn.net/candycat1992/article/details/21827365 制作cubeMap三维纹理,surface ...
- java 28 - 6 JDK7的新特性
JDK7的新特性: 二进制字面量 数字字面量可以出现下划线 switch 语句可以用字符串 泛型简化 异常的多个catch合并 try-with-resources 语句 二进制字面量 JDK7开始, ...
- Spring JPA Junit 关闭自动回滚
因为用了JPA配合Hibernate ,采用注解默认是开启了LayzLoad也就是懒加载,所以不得不在Junit的单元测试上加上@Transactional注解 这样Spring会自动为当前线程开启S ...
- zlog学习笔记(zc_profile)
zc_profile.h #ifndef __zlog_profile_h #define __zlog_profile_h #define EMPTY() #define zc_assert(exp ...
- smarty foreach循环
1,smarty foreach1,单纯的数组array(1000,2000,3000),使用foreach(from = $array item=foo){$foo}2,键值对数组<ul> ...
- npm淘宝镜像
前端开发会用到npm的包,但是国外的速度有时候很慢,幸运的是,淘宝做了镜像,一起来看看吧. https://npm.taobao.org/
- document.elementFromPoint在IE8下无法稳定获取当前坐标元素的解决方法
document.elementFromPoint(e.clientX, e.clientY) document.elementFromPoint(e.clientX, e.clientY) 执行2次 ...