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 = ...
随机推荐
- Docker+OpenvSwitch搭建VxLAN实验环境
一.概述 1.环境:我这里是2台linux机器(host1和host2),发行版是kali2.0, ...
- Windows Azure IP地址详解
Windows Azure上的IP地址有以下几种: 公网IP地址 VIP ILPIP Reserved IP 内网IP地址 DIP Static IP VIP是动态分配的公网IP,VIP可以被分配到云 ...
- 连接到Windows Azure Point to Site VPN
Windows Azure支持两种模式的VPN接入: Site to Site,接入端需要有固定的公网IP地址,用于连接局域网和Windows Azure的虚拟网络. Point to Site,客户 ...
- java 知识点随记
JAVA 读取配置文件: Properties props= new Properties();//文件在src目录下,编译会被加载到classpath下. Props.load(Test.class ...
- git 添加远程仓库遇到的问题
上午在学习廖雪峰老师的 git 教程(http://www.liaoxuefeng.com/),在添加远程仓库这一节中遇到了两个问题: 问题描述: 一.关联自己的远程仓库. fatal: Not a ...
- samsung Galaxy s2(GT i9100g )刷机升级至4.4小记
从昨天上午到现在,大部分时间都是在将i9100g更新到4.4.虽然中途也做了一些别的事情,但是更新过程还是走了一点弯路,比开始预想的稍微慢了一点,现在将完整的更新步骤分享给大家,以帮助后来的同学.升级 ...
- 让IE10等支持classList2.0(转)
chrome24+, firesfox26+起支持classList2.0,即让它同时添加或删除多个类名, toggle方法支持第2个参数,用于强制添加或删除 var div = document.c ...
- offsetLeft与offsetTop详解
offsetLeft与offsetTop使用方法一样,只是一个是找距离定位父级(position:relative)左边的距离,一个是找距离定位父级上边的距离 没有定位则找body,我们还是看看ie7 ...
- Entity Framework 迁移命令 详解
一.Entity Framework 迁移命令(get-help EntityFramework) Enable-Migrations 启用迁移 Add-Migration 为挂起的Model变化添加 ...
- C#开源系统大汇总
一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(as ...