Hibernate  配备了一种非常强大的查询语言,这种语言看上去很像  SQL。但是不要被语法结构上的相似所迷惑,HQL  是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的概念。

基本规则

  1. HQL语法类似于SQL,也是一种select from结构的语句。但是他后面跟的不是表名和字段名,而是类名和属性名。
  2. HQL基本查询语法跟SQL很类似
  3. HQL大小写不敏感。但是,设计java类名、包名、属性名时大小写敏感。
  4. 包名的使用情况。比如:如果注册的实体类Emp只有一个类,那么查询时可以不加包名,hibernate会自动检索到Emp类。但是如果注册多个实体类,名字都叫Emp。此时就要增加包名来区别多个实体类。

第一个HQL查询

 package com.qcf.test;

 import java.util.List;

 import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; import com.qcf.po.User; public class TestHiber {
public static void main(String[] args) {
//读取配置文件中的信息
Configuration con=new Configuration().configure();
//获取sessionFactory对象
SessionFactory factory=con.buildSessionFactory();
//获取Session对象
Session session=factory.openSession();
String hql="from User";
//创建HQL查询
Query query= session.createQuery(hql);
List list=query.list();
//对查询的结果进行遍历
for (int i = 0; i < list.size(); i++) {
User user=(User) list.get(i);
System.out.println(user.getName());
} session.close();
}
}

查询结果:

根据返回类型划分HQL查询

  1、单个对象

  在这里提醒一下,这个hql意识统计数据库的记录数,一般我们都知道count(1) 要比count(*) 快多了,但是这里必须使用count(*) 使用count(1)就会报错!

 package com.qcf.test;

 import java.util.List;

 import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; import com.qcf.po.User; public class TestHiber {
public static void main(String[] args) {
//读取配置文件中的信息
Configuration con=new Configuration().configure();
//获取sessionFactory对象
SessionFactory factory=con.buildSessionFactory();
//获取Session对象
Session session=factory.openSession();
String hql="select count(*) from User";
//创建HQL查询
Query query= session.createQuery(hql);
Number n=(Number) query.uniqueResult();
System.out.println(n.intValue()); session.close();
}
}

  2、List集合

参考第一个HQL查询中的内容!

  3、Object[]数组
  有时候,我们不需要讲实体类的所有属性查找出来,只需要查找部分属性。这时,可以将返回的内容放入Object[]中,而不是实体对象中。

 String hql="select u.name,u.age from User u";
//创建HQL查询
Query q= session.createQuery(hql);
List<Object[]> list=q.list();
for (int i = 0; i < list.size(); i++) {
Object[] os=list.get(i);
System.out.println("用户名是:"+os[0]+"年龄是:"+os[1]);
}

  显示结果:

  Hibernate: select user0_.username as col_0_0_, user0_.userage as col_1_0_ from user user0_
  用户名是:哈哈年龄是:18
  用户名是:三个年龄是:18
  用户名是:张三年龄是:18
  用户名是:李四年龄是:18
  用户名是:王五年龄是:18
  用户名是:张柳 年龄是:18

  4、Map集合

  我们也可以将查询后的结果放到map中

 String hql="select new map(u.name as name,u.age as age) from User u";
//创建HQL查询
Query q= session.createQuery(hql);
List<Map> list=q.list();
for (int i = 0; i < list.size(); i++) {
Map map=list.get(i);
System.out.println("用户名"+map.get("name")+"年龄"+map.get("age"));
}
session.close();

  显示结果:

  Hibernate: select user0_.username as col_0_0_, user0_.userage as col_1_0_ from user user0_
  用户名哈哈年龄18
  用户名三个年龄18
  用户名张三年龄18
  用户名李四年龄18
  用户名王五年龄18
  用户名张柳 年龄18

  5、实体对象

  对于只查询部分属性的情况,Object数组、Map都很方便。实际上,我们也可以通过构造方法,将查出的数据直接封装到实体对象中。

     新增构造方法:
public Emp(Short empno, String ename) {
super();
this.empno = empno;
this.ename = ename;
}
String hql = "select new Emp(e.empno,e.ename) from Emp e ";
Query q = session.createQuery(hql); List<Emp> list = q.list();
for(int i=0;i<list.size();i++){
Emp e = list.get(i);
System.out.println("雇员编号:"+e.getEmpno()+"-雇员名字"+e.getEname());
}

  6、Where子句和参数传递

 //            String hql = "from Emp  where ename=?";
String hql = "from Emp where ename=:ename"; //使用参数名称动态绑定!(推荐使用!)
Query q = session.createQuery(hql);
// q.setString(0, "SMITH"); //参数索引从0开始计数,而不像jdbc一样从1开始。
q.setString("ename", "SMITH");
List list = q.list();
for(int i=0;i<list.size();i++){
Emp c = (Emp) list.get(i);
System.out.println(c.getEname());
}

  7、HQL分页查询

  分页显示是项目中必不可少的功能,不同的数据库有不同的分页方式,hibernate替我们屏蔽了数据库中之间的差异。我们通过如下简单的代码即可实现分页功能(如果分页的原  理和做法忘记了,可以参考之前讲授的项目内容)。

     String hql = "from Emp";
Query q = session.createQuery(hql);
q.setFirstResult(0); //从第几条开始取数据
q.setMaxResults(10); //设置每页最多显示记录的个数 List list = q.list();
for(int i=0;i<list.size();i++){
Emp c = (Emp) list.get(i);
System.out.println(c.getEname());
}

  8、跨表查询和对象导航

  

  SQL中复杂的表连接查询,跨表操作。在HQL中进行了相当的简化,我们只需要简单的使用属性即可,类似于我们前面学过的EL表达式。这样,我们可以用简单的代码写出比较  复杂的查询。

             String hql = "from Emp e where e.dept.deptno=? ";
Query q = session.createQuery(hql);
q.setInteger(0, 10);

  9、Join(内连接、外连接)

SQL中我们有内连接、右外连接、左外连接、全外连接,在HQL中我们也有这些概念。不过,有如下几点不一致:

  1. 如果两个实体类之间没有任何关系,那么不能使用join
  2. 由于只有两个实体类之间有关联关系才能使用join,因此不需要像SQL那样通过on指明连接条件。

  代码示例如下:

 String hql = "select e.ename,d.dname from Emp e left join e.dept d ";

 Query q = session.createQuery(hql);

  10、SQL原生查询(Native SQL)

  

  有时候HQL可能不能满足我们的要求。我们需要使用原始的SQL来完成我们的功能。我们可以通过如下方式,在hibernate中使用SQL查询:

             String sql = "select ename,sal from emp where empno=:id";
SQLQuery q = session.createSQLQuery(sql);
q.setInteger("id", 7369);
List list = q.list(); //返回的结果为List<Object[]>
for(int i=0;i<list.size();i++){
Object[] c = (Object[]) list.get(i);
System.out.println(c[0]+"-"+c[1]);
}
String sql = "select * from emp where empno=:id";
SQLQuery q = session.createSQLQuery(sql);
q.setInteger("id", 7369);
q.addEntity(Emp.class);
List<Emp> list = q.list();
for(int i=0;i<list.size();i++){
Emp c = list.get(i);
System.out.println(c.getEname()+"-"+c.getSal());
}

Hibernate 之强大的HQL查询的更多相关文章

  1. J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())

    J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())   当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...

  2. 【Hibernate】Hibernate系列6之HQL查询

    HQL查询 6.1.概述 6.2.分页查询 6.3.命名查询 6.4.投影查询-部分字段查询 6.5.报表查询 6.6.迫切左外连接.左外连接 6.7.迫切内连接.内连接 6.8.QBC查询.本地查询

  3. Hibernate学习笔记(十) — HQL查询

    一.HQL的一对多查询 班级(1)->(多)学生 /** * 实现Classes与Student的内连接 * * SELECT c.*,s.* * from classes c INNER JO ...

  4. hibernate中.常见的hql查询语句

    hql是非常有意识的被设计为完全面向对象的查询 基本规则: 1.hql语法类似于sql,但它后面跟的不是表名和字段名,而是类名和属性名 2.hql大小写不敏感.但是设计java类名,包名,属性名时大小 ...

  5. Hibernate框架之HQL查询与Criteria 查询的区别

    Hibernate框架提供了HQL查询和Criteria 查询.下面对这两种查询分别做个例子.也好对这两种查询方法有个大概的了解.就用房屋信息表做例子,查询所有房屋信息. HQL语句查询所有房屋信息: ...

  6. Hibernate--------八大类HQL查询集合

    Hibernate的   八大类HQL查询集合 Hibernate的八大类HQL查询集合: 一:属性查询(SimplePropertyQuery) 1,单一属性查询 *返回结果集属性列表,元素类型和实 ...

  7. 转: Hibernate HQL查询 插入 更新(update)实例

    1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hq ...

  8. 第六讲(二) Hibernate HQL查询

    HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibe ...

  9. Hibernate查询之HQL查询

    转自:http://blog.csdn.net/xiao_yi/article/details/1733342 Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(H ...

随机推荐

  1. 【转】MAT(Memory Analyzer Tool)工具入门介绍

    1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...

  2. Makefile 中:= ?= += =的差别 和条件运行

    一:在Makefile中常常看到obj-m    := scull.o和KERNELDIR ?= /lib/modules/等不同的赋值方式,如今总结他们的差别: = 是最主要的赋值 := 是覆盖之前 ...

  3. 经纪xx系统节点VIP案例介绍和深入分析异常

    系统环境    硬件平台 &  操作 IBM 570 操作系统版本号  AIX 5.3 物理内存  32G Oracle 产品及版本号  10.2.0.5 RAC 业务类型  OLTP 背 ...

  4. MySQL列:innodb的源代码的分析的基础数据结构

    在过去的一年中的数据库相关的源代码分析.前段时间分析levelDB实施和BeansDB实现,数据库网络分析这两篇文章非常多.他们也比较深比较分析,所以没有必要重复很多劳力.MYSQL,当然主要还是数据 ...

  5. 【面试】【Spring常见问题总结】【09】

    81.SimpleJdbcTemplate SimpleJdbcTemplate类也是基于JdbcTemplate类,但利用Java5+的可变參数列表和自己主动装箱和拆箱从而获取更简洁的代码. Sim ...

  6. HTML5 3D翻书效果(双面效应)

    最后使用HTML5翻书效果达到测试,比较简单,它的升级版是 最后一个问题: 1)后,原来的页面连环画将成为一面镜子 2)无法实现双面翻书. 3)明显感觉页面似有近遮挡标志. 这次的升级版本号实现过程比 ...

  7. [SignalR]配置路由

    原文:[SignalR]配置路由 注册路由,在代码如下(SignalR 1.*): 脚本修改如下: 但是其官方文档解释是: By default, the route URL which client ...

  8. cygwin的163镜像(转)

    国内的cygwin源镜像: 1.163源 http://mirrors.163.com/.help/cygwin.html 收录架构 x86 x86_64 收录版本 所有版本 更新时间 每天更新一次 ...

  9. HDOJ--4821--String【弦hash】

    联系:http://acm.hdu.edu.cn/showproblem.php?pid=4821 题意:给一个字符串,选m个长度为l的子串组成新的串.要求这m个子串互不同样,问有多少种组合. 字符串 ...

  10. 【ThinkingInC++】2、输入和输出流

    /** *特征:输入和输出流 *时间:2014年8月8日07:37:35 *作者:cutter_point */ #include<iostream> using namespace st ...