HQL 是指Hibernate Query Language,它是Hibernate的查询语言,拥有一套自己的查询机制,它的查询语句和SQL非常类似。在使用的时候可以非常快上手。HQL提供了基本上SQL全部的查询功能,可是在使用HQL查询时有非常多地方须要注意。该篇文章整理了HQL查询过程中须要注意的一些主要的语法问题,在使用HQL查询时希望避免这些问题。

一、Hibernate简单介绍


HQL採用的是标准化对象查询。它是以对象的方式进行查询。将查询语句封装为对象操作。长处:可读性好。复合java程序猿的编码习惯。缺点:不够成熟,不支持投影或统计函数。



       样例:查询username以“J”开头的全部用户

Criteria criteria=session.createCriteria(User.class);
criteria.add(Expression.like("name","J%"));
List users=criteria.list();

HQL它是全然面向对象的查询语句,查询功能很强大。具备多态、关联等特性。它是利用面向对象的方式生成SQL。以类和属性来取代表和数据列。它同一时候支持多态。支持各种关联,降低了SQL的冗余。

HQL支持全部的关系数据库操作:连接(join。包含Inner/outer/full joins),笛卡尔积(cartesian products),投影(projection),聚合(Aggregation,max,avg)和分组(group), 排序(Ordering),子查询(Subqueries),SQL函数(SQL function calls)。

二、 查询方法

2.1 createQuery


createQuery方法被封装在Session中,它可以依照查询语句查询获取数据库中整张表的数据。它会创建一个新的Query接口。该方法须要使用HQL查询字符串作为该方法的參数,并将最后查询到的对象保存在List对象中。详细用法例如以下代码:

package com.hibernate;

import java.util.Iterator;
import java.util.List; import junit.framework.TestCase; import org.hibernate.Query;
import org.hibernate.Session; public class testTable extends TestCase { public void testCreateQuery(){
Session session=null;
try{
//获取session对象
session=HibernateUtils.getSession();
//开启事务
session.beginTransaction();
//查询获取整张表
Query query=session.createQuery(" from User"); //获取表单对象
List list=query.list();
//定义迭代器,迭代获取每一个对象
for(Iterator ite=list.iterator();ite.hasNext();){
User user=(User)ite.next();
System.out.println("id号为"+user.getId()+" 姓名为:"+user.getName()+" ");
}
//业务提交
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
session.close();
}
}
}

查看输出结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdfeGlueGl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

数据库中总共同拥有三条数据。所以在控制台中总共输出了三条数据。让我们回头查看查询语句。createQuery方法中使用了HQL查询字符串。其内容为"from User",该方法创建了一个Query对象,它把查询得到的信息存放到List对象中,想要的对象从List中获取就可以。

Note:查询字符串中的User是对象的类名,并非数据库中表的名称。

在使用HQL查询内容时,肯定会用到该方法,它返回一个Query接口,查询到的对象能够转化为List类型或者Iterate类型的集合,可通过迭代器获取查询对象,获取的两种类型的集合还是不同样的。List类型的默认情况下每次都会发出sql语句,而且将数据放到缓存中,可是不利用缓存。Iterate,默认情况下是从缓存中查询数据,假设缓存中不存在对象则会产生N+1问题(每次使用查询语句将对象载入到内存中。然后再读取)。具体差别将会在接下来的文章中讨论。

2.2 简单属性查询

在使用HQL查询语句时能够指定查询表的属性。它的用法同主要的SQL语句,在查询语句中加入表字段来获取对应的查询字段集合。不同的是HQL中的字段是对象的属性名称。须要指定属性名称方能查询获取对应的字段集合。

2.2.1  查询对象Student

创建一个Student类,并将类映射为对应的数据库表,查询数据库表中的数据。Student类文件内部代码例如以下:

package com.src.hibernate;

import java.util.Date;

public class Student {

	public Student() {
} //关联的班级对象
private Classes classes;
public Classes getClasses() {
return classes;
}
public void setClasses(Classes classes) {
this.classes = classes;
} //学生id
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
} //学生姓名
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} //创建时间
private Date createTime;
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}

对应的映射文件代码例如以下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.src.hibernate.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="createTime"></property>
<!-- 在多的一端Student中加入一行新的Classes列 ,而且列的名称要和Classes.hbm.xml的列明同样-->
<many-to-one name="classes" column="classesid"></many-to-one>
</class>
</hibernate-mapping>

2.2.2 属性查询

属性查询是指在select语句中的字段列是对应对象的属性名称,这样在查询时可依据提供的属性列来查询获取想要的字段集合,另外在简单属性查询中能够分为单一属性查询和多个属性查询。单一属性是指在select字段中加入对象的单个字段。相反的多属性查询是加入多个字段列。假设想要查询获取对象的全部列,能够在select后加入对象的别名,这样能够查询到对象的全部列,例如以下的查询代码:

//多个属性查询,返回Object
@SuppressWarnings({ "unchecked", "rawtypes" })
public void testQuery2(){
Session session=null; try{
session=HibernateUtils.getSession();
session.beginTransaction(); //查询多个属性,返回对象数组集合。通过使用对象的别名来查询对象的全部列属性,别名的使用同SQL
//假设使用select查询实体对象。必须使用别名
//HQL不支持*查询,可是支持Count(*)查询
List students=session.createQuery("select s from Student s").list(); for(Iterator iter=students.iterator();iter.hasNext();){
Student student=(Student)iter.next();
System.out.println(student.getName());
} session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}

HQL的查询不支持*查询。可是能够通过使用类的别名来替代*查询,同一时候HQL可支持Count(*)查询,查询简单易懂。

2.3 分页查询


获取的Query对象能够使用分页查询,通过设置对象的setFirstResult和setMaxResults来获取指定的行数据,详细代码例如以下:

try{
//获取session对象
session=HibernateUtils.getSession();
//开启事务
session.beginTransaction();
//查询获取整张表
Query query=session.createQuery(" from User"); //分页查询
//设置查询事实上地址
query.setFirstResult(2);
//设置查询最大的条数
query.setMaxResults(2);
//获取表单对象
List list=query.list();
//定义迭代器,迭代获取每一个对象
for(Iterator ite=list.iterator();ite.hasNext();){
User user=(User)ite.next();
System.out.println("id号为"+user.getId()+" 姓名为:"+user.getName()+" ");
}
//业务提交
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
session.close();
}

运行上面的查询语句,获取查询结果例如以下图:

结语


HQL查询在功能上可以和SQL查询媲美,但和SQL不同的是HQL是全然面向对象的查询语言,具备多态关联等的特性。它是利用面向的对象的方式生成SQL,以类及属性取代表和表列,在使用时简单易懂。该篇文章具体讨论了HQL的基本查询内容。有关很多其它HQL的问题将会在下篇文章中着重讨论。

【Hibernate步步为营】--hql查询小介的更多相关文章

  1. hibernate的hql查询

    1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...

  2. Hibernate之HQL查询

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

  3. Hibernate五 HQL查询

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

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

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

  5. hibernate的hql查询语句总结

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

  6. Hibernate(九)HQL查询

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

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

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

  8. Hibernate 、Hql查询和Criteria查询

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

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

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

随机推荐

  1. css弹性盒子

    body元素设置: <body> <div id="wai"> <div class="zi">1</div> ...

  2. Hadoop案例(四)倒排索引(多job串联)与全局计数器

    一. 倒排索引(多job串联) 1. 需求分析 有大量的文本(文档.网页),需要建立搜索索引 xyg pingping xyg ss xyg ss a.txt xyg pingping xyg pin ...

  3. hdu4796

    4月真是没写啥题,这题还是月初写的…… 不错的插头dp,首先由n和m的范围知肯定是轮廓线是横向划的 问题的难点在于怎么处理下面两个问题 1.怎么处理独立插头 2.怎么处理完全将W和L左右隔开 先说独立 ...

  4. lr中用strtok函数分割字符串

    需要在loadrunner里面获得“15”(下面红色高亮的部分),并做成关联参数. ,6,5,0,4,0,3,0,3,2,0,0,0,1 用web_reg_save_param取出“8,7,5,15, ...

  5. Wannafly挑战赛18 B - 随机数

    思路:化简公式,Pn 表示 进行n 次操作,有奇数次1的概率 Pn = (1 - x) * Pn - 1  + x * (1 - Pn - 1) 得通项公式 Pn = (1 - (1 - 2 * x) ...

  6. shell-命令行参数(转)

    命令行参数 (转自http://c.biancheng.net/cpp/view/2739.html) 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字, ...

  7. Python模块-xml

    XML的例子 import xml.etree.ElementTree as ET tree = ET.parse("test.xml") root = tree.getroot( ...

  8. 【算法与数据结构实战】线性表操作-实现A并B,结果放入A中

    //数据结构与算法基础题1:线性表操作,实现A并B,结果放入A中 #include "stdafx.h" #include <iostream> #include &l ...

  9. functools.wraps 带参数的装饰器 多个装饰器装饰同一个函数

    装饰器开发原则 : 开放封闭原则装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质 : 闭包函数 def wrapper(func): def inner(*args, ...

  10. HDU4893【线段树单点、区间更新】

    题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=4893] 题意:输入n.q.表示有n个数,初始化默认这n个数都为零,有q次操作,操作种类分为三种:1.输 ...