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. hive中的一种假NULL现象

    使用hive时,我们偶尔会遇到这样的问题,当你将结果输出到屏幕时,查出的数据往往显示为null,但是当你将结果输出到文本时,却显示为空(即未填充),这是为什么呢? 在hive中有一种假NULL,它看起 ...

  2. dedecms调用标签总结(一)

    dedecms 基本包含了一个常规网站需要的一切功能,拥有完善的中文学习资料,很容易上手,学习成本较低.学会dedecms 的模板修改.栏目新增.内容模型新增和常用的标签调用方法后,即便我们不懂 ph ...

  3. 1.使用using释放资源

    using语句有二个关键字 >>作为关键字,using可以导入命名空间 >>作为C#语句,using可以释放对象占用的内存资源 语法: using(SqlConnection ...

  4. IIS7.5中神秘的ApplicationPoolIdentity

    IIS7.5中(仅win7,win2008 SP2,win2008 R2支持),应用程序池的运行帐号,除了指定为LocalService,LocalSystem,NetWorkService这三种基本 ...

  5. Flex数据绑定陷阱(一)

    Flex数据绑定陷阱:常见的误用和错误 当构建Flex或者Adobe AIR程序时,将一个对象的值自动的传递给另一个对象这种处理是数据绑定最常 用并最有用的特征之一. 尽管如此,同时数据绑定会减缓程序 ...

  6. [AIR] as3 之条件编译多平台妙用

    http://bbs.9ria.com/thread-418864-1-1.html 一直希望as3 可以支持条件编译,即满足A时编译函数1,满足B时则编译函数2. 最佳百度了之后,发现原来是可以实现 ...

  7. Android app 简单的电话拨号器

    实现步骤: 1.画UI 可以用拖拽和文本编辑. 2.根据UI写业务逻辑  在MainActivity中的onCreate中编写 //get editText content et_number = ( ...

  8. 开发之UI篇

    首先这里介绍一个软件一个插件,它们的主要功能是方便开发者看UI(如尺寸,颜色,大小等),两个配合使用 一. Sketch软件 1.Sketch  看ui图,还可以切图 2.Sketch 如何切图: 1 ...

  9. HTML-学习笔记(样式)

    HTML 样式 style属性用于改变HTML元素的样式. <p style="font-family: arial; color: red;">字体是arial,字体 ...

  10. zookeeper多节点配置

    单机多节点模式 zookeeper解压, 放到 /opt/zookeeper/ 下, 同目录再放一个 server1目录, 下面建data和log两个目录用于存放数据和日志 zoo.cfg [milt ...