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查询的更多相关文章

  1. Hibernate之HQL查询

    一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...

  2. Hibernate五 HQL查询

    HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...

  3. Hibernate 的hql查询简介【申明:来源于网络】

    Hibernate 的hql查询简介[申明:来源于网络] Hibernate 的hql查询简介:http://blog.csdn.net/leaf_130/article/details/539329 ...

  4. hibernate的hql查询语句总结

    这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Class ...

  5. Hibernate(九)HQL查询

    一.Hibernate提供的查询方式 OID查询方式:主键查询.通过get()或者load()方法加载指定OID的对象查询结果为一个 HQL查询方式:通过Query接口使用HQL语言进行查询 QBC查 ...

  6. Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

    在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...

  7. Hibernate 、Hql查询和Criteria查询

    HQL查询: public Object query(String name){ Session s=null; try{ s=HibernateSessionFactory.getSession() ...

  8. Hibernate之HQL查询的一些例子

    Hibernate配备了一种非常强大的查询语言,就是HQL(hibernate query language),HQL看上去很像sql,但只是语法结构上相似,HQL是一种面向对象的查询,他可以理解继承 ...

  9. Hibernate 中Hql 查询中间表的用法

    案例简述: 项目中存在User 用户表 和 Role 角色表 它们之间是多对多的关系 在User类定义中 使用hibernate注解 //角色列表 @ManyToMany(targetEntity = ...

随机推荐

  1. maven项目下jsp文件中el表达式失效问题

    本来是为了写个springmvc的小demo,雏形搭建起来后想起来做成maven的好了,就重新建的maven项目,坑就从这里开始了... maven创建web项目默认使用的是web 2.3版本,web ...

  2. Book LIst

    Go ahead. Linux APUE Linux Kernel Development 鸟哥的linux私房菜 基础篇 鸟哥的linux私房菜 服务器篇 Network Computer Netw ...

  3. pyenv 使用简介

    pyenv 是一个 python 版本管理工具,可以方便用户在不同的 python 版本间切换,例如我的电脑里默认的 python 是 2.6, 但我还想装 2.7 3.5 等.另有一个名为 pyen ...

  4. u3d_shader_surface_shader_5

    CubeMap 的实现 参考: http://blog.csdn.net/candycat1992/article/details/21827365     制作cubeMap三维纹理,surface ...

  5. java 28 - 6 JDK7的新特性

    JDK7的新特性: 二进制字面量 数字字面量可以出现下划线 switch 语句可以用字符串 泛型简化 异常的多个catch合并 try-with-resources 语句 二进制字面量 JDK7开始, ...

  6. Spring JPA Junit 关闭自动回滚

    因为用了JPA配合Hibernate ,采用注解默认是开启了LayzLoad也就是懒加载,所以不得不在Junit的单元测试上加上@Transactional注解 这样Spring会自动为当前线程开启S ...

  7. zlog学习笔记(zc_profile)

    zc_profile.h #ifndef __zlog_profile_h #define __zlog_profile_h #define EMPTY() #define zc_assert(exp ...

  8. smarty foreach循环

    1,smarty foreach1,单纯的数组array(1000,2000,3000),使用foreach(from = $array item=foo){$foo}2,键值对数组<ul> ...

  9. npm淘宝镜像

    前端开发会用到npm的包,但是国外的速度有时候很慢,幸运的是,淘宝做了镜像,一起来看看吧. https://npm.taobao.org/

  10. document.elementFromPoint在IE8下无法稳定获取当前坐标元素的解决方法

    document.elementFromPoint(e.clientX, e.clientY) document.elementFromPoint(e.clientX, e.clientY) 执行2次 ...