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 = ...
随机推荐
- [转]ASP.NET MVC Dynamic Themes
本文转自:http://www.codeproject.com/Articles/32847/ASP-NET-MVC-Dynamic-Themes Download source code - 148 ...
- PADS Logic Decal、Layout Decal绘制
绘制Logic Decal图形: 1.Gate Decal与Part Type的区别: Gate Decal:即元器件在原理图中所展现出来的形状 Part Type:将元件图形.电气特性都进行定义后所 ...
- 转载:学习Entity Framework 中的Code First
看完觉得不错,适合作为学习资料,就转载过来了 原文链接:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html 这是上周就写 ...
- 《2016ThoughtWorks技术雷达峰会----微服务架构》
微服务架构 王键,ThoughtWorks, 首席咨询师 首先微服务架构的定义,thoughtWorks在2012年3月的技术雷达中这样定义: “微服务架构是一种架构,它提倡将单一应用程序划分为一 ...
- [No00003B]string格式的日期时间字符串转为DateTime类型
新建console程序,复制粘贴直接运行: /**/ //using System.Globalization;//代码测试大致时间2015/11/3 15:09:05 //方法一:Convert.T ...
- java 27 - 3 反射之 通过反射获取构造方法并使用
类 Constructor<T>:提供关于类的单个构造方法的信息以及对它的访问权限. 通过反射的方法获取构造方法并使用 ps:先忽略泛型 A.1:获取构造方法的数组: public Co ...
- win10的安装与下载
1.下载介质创建工具 https://www.microsoft.com/zh-cn/software-download/windows10 2. 下载iso https://www.microsof ...
- svn恢复被删除的分支 svn del 分支
笔者不小心,在操作时,删除了一个主开发分支(main_dev). 一. 悲剧的语句: svn del -m"1.误删除分支" http://svr_path/branches/ ...
- gzip: stdout: No space left on device问题的解决
一.问题描述 最近安装了ubuntu14.04,并在ubuntu14.04中编译了一次内核.这之后大部分情况下用sudo apt-get install 安装应用都会出现“gzip: stdout: ...
- css3属性选择器