HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类,对象和属性的概念。

使用HQL查询所有学生:

public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction(); String hql = "from Student";
Query query = session.createQuery(hql);
List<Student> students = query.list();
System.out.println(students); session.getTransaction().commit();
}

字符串 hql 是一条HQl语句,其中Student是指类名而不是表名,该语句查询Student类所映射的表的所有信息。
使用HQL查询时需要使用到org.hibernate.Query接口,使用Session.createQuery()方法来得到一个Query。

使用Query.list方法向数据库查询数据,hibernate会自动把数据封装为相应的List集合。你也可以使用query.iterate()来得到一个Iterate。

查询单个对象(使用 uniqueResult()):

public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction(); String hql = "from Student where id = 1";
Query query = session.createQuery(hql);
Student student = (Student)query.uniqueResult();
System.out.println(student); session.getTransaction().commit();
}

HQL 语句里可以有where字句,其中where id = 1 查找 id属性为1的学生,注意的是id是Student对象的属性,而不是表的列名!
确得查询结果只有一条记录事,可以使用Query.uniqueResult()方法。hibernate会自动把数据封闭为相应的对象。

查询指定的列:

public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction(); String hql = "select id,name from Student";
Query query = session.createQuery(hql);
List<Object[]> s = query.list(); session.getTransaction().commit();
}

HQL可以只查询表的其中一列或多列。使用select字句,其中id和name是Student对象的属性名,而不是表的列名!
只查询指定列返回的是一个List<Object[]>对象。List里的一条记录对应数据库表的一行。Object[]的一个元素即对应表的一个单元格。

如果使用 uniqueResult() 那返回的就是Object[]对象。

带命名参数的HQL:

public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction(); String hql = " from Student where name like :name";
Query query = session.createQuery(hql);
query.setString("name", "张%");
List<Student> s = query.list(); session.getTransaction().commit();
}

在HQL中,使用 : 加命名(如 :name)作为占位符,再使用Query.setString(),query.setInteger()等方法为相应的占位符设置参数(不确定类型可以使用setParameter())。
上面例子中的HQL语句等同于 "from Student where name like '张%'"

实例参数查询:

通过添加一个新类来作为HQL语句查询条件的参数。

public class BookQuery {

    private String name;
private String author;
private double maxPrice;
private double minPrice; //省略get,set语句......... }

查询任意名字,作者姓张,价格在5-20之间的图书:

public static void main(String[] args) {
//创建查询条件对象
BookQuery bq= new BookQuery();
bq.setName("%");
bq.setAuthor("张%");
bq.setMinPrice(5);
bq.setMaxPrice(20); Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction(); String hql = "from Book where name like :name "
+ "and author like :author "
+ "and price between :minPrice and :maxPrice";
Query query = session.createQuery(hql);
//把查询条件对象作为HQL查询的参数
query.setProperties(bq);
List<Book> books = query.list(); session.getTransaction().commit();
}

BookQuery类的属性名必须和HQL语句的参数名一致,并提供get,set方法。
通过 setProperties()方法把查询条件对象作为HQL查询的参数。

连接查询(join 语法):

public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction(); String hql = "from Student s inner join s.grade g";
Query query = session.createQuery(hql);
List<Object[]> s = query.list(); session.getTransaction().commit();
}

内连接使用join,左外连接使用left join,右外连接使用reght join。和sql语句基本一致。
join 后面是 s.grade 而不是直接写 Grade 类名。

因为表之间的关联关系已经通过映射文件或注解设好,所以在join子句中不需要声明关系。

上面例子里同时返回学生和班级的所有信息,返回值是一个 List<Object[]><Object[]> 。其中每一个Object[]里,下标0的元素为Student对象,下标1的元素为Grade对象。

使用聚合函数:

public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction(); String hql = "Select count(s) from Student s";
Query query = session.createQuery(hql);
Object count = query.uniqueResult(); session.getTransaction().commit();
}

count()求总数、avg(...), sum(...), min(...), max(...)分别是平均值,总和,最大,最小值。

Hibernate 分页:

public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction(); String hql = "from Student ";
Query query = session.createQuery(hql);
query.setFirstResult(2);
query.setMaxResults(2);
List<Student> s = query.list();
System.out.println(s);
session.getTransaction().commit();
}

setFirstResult:设置开始行,从0开始。

setMaxResults:设置取的记录数。

HQL命名查询:

通过把hql语句写到外部映射文件(*.hbm.xml)来实现HQL和代码分离。

在学生表的映射文件中加入如下代码:

<query name="getStudent">
<![CDATA[from Student where id=:id]]>
</query>

<query>标签写在<hibernate-mapping>标签内。
<![CDATA[   ]]>  写的是一条HQL语句。

通过<query>标签的name属性为该HQL指定一个名称。

public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction(); Query query = session.getNamedQuery("getStudent");
query.setInteger("id", 6);
Student s = (Student)query.uniqueResult(); session.getTransaction().commit();
}

通过session.getNamedQuery()方法得到一个用于命名查询的Query。把HQL语句的名称传进去。

Hibernate 查询:HQL查询(Hibernate Query Languge)的更多相关文章

  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查询 查询某几列

    HQL 是Hibernate Query Language的简写,即 hibernate 查询语言:HQL采用面向对象的查询方式.HQL查询提供了更加丰富的和灵活的查询特性,因此Hibernate将H ...

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

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

  6. HQL查询——HQL查询的基本用法

    HQL查询--HQL查询的基本用法 1.HQL语法类似于SQL语法,但是需要注意的是,HQL是一种完全面向对象的查询语言.SQL语言操作的对象是数据表.列等数据库对象,而HQL语言的操作对象是类.实例 ...

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

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

  8. Hibernate(十)HQL查询二

    一.数据库的emp名和dept表 建立持久化类和配置文件,可以用MyEclipse直接生成 持久化类 package entity; import java.util.Date; public cla ...

  9. Hibernate(九)HQL查询

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

  10. hibernate 中HQL查询

    由于比较简单,在此处只写一些HQL语言. 表关系,多对一. CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, `uname` varchar( ...

随机推荐

  1. CSS---------------之文本类型

    通过font来改变文本,主要从以下几个方面 字体加粗,字体的风格:斜体和字体变形:小型大写字母 字体的大小 行高 字体 示例如下 p{font:italic 75%/125% "Comic ...

  2. Visual Studio - 提升幸福感的N个快捷键

    现代化IDE给程序猿提供了极大的方便,掌握一些优秀的开发工具,使我们写代码时有行云流水般的快感. VS作为宇宙最强没有之一的IDE,用起来也是好幸福.下面是我最常用的快捷键,已经印在手指上,每次好像不 ...

  3. PHP学习笔记二十九【接口】

    <?php //定义接口 //接口可以定义属性,但必须是常量而且是public //接口的所有方法必须是public interface Iusb{ public function start( ...

  4. 我跟着siki学Unity3D游戏开发——PongGame

    一.屏幕坐标转换为世界坐标. 1.游戏逻辑,根据界面布局,将墙体控制到对应的位置: vector3 position=Camer.main.ScreenToWorldPoint(new vetor2( ...

  5. hibernate中.hbm.xml和注解方式自动生成数据表的简单实例(由新手小白编写,仅适用新手小白)

    绝逼新手小白,so 请大神指点! 如果真的错的太多,错的太离谱,错的误导了其他小伙伴,还望大神请勿喷,大神请担待,大神请高抬贵嘴......谢谢. 好了,正题 刚接触ssh,今天在搞使用.hbm.xm ...

  6. JDBC学习入门

    一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...

  7. Tomcat学习笔记 - 错误日志 - Tomcat部署项目或修改xml配置出现无法保存的情况(拒绝访问)

    原因分析:(windows下) 可能有人会发现在编辑好 tomcat-users.xml 文件后无法保存,原因是使用的用户没有权限修改文件,可能是把 Tomcat 发行包放到了一个需要管理员权限才能修 ...

  8. [c language] getopt 其参数optind 及其main(int argc, char **argv) 参数解释

    getopt被用来解析命令行选项参数.#include <unistd.h> extern char *optarg; //选项的参数指针extern int optind, //下一次调 ...

  9. 【python学习笔记01】python的数据类型

    python的基本数据类型 整型 int 浮点型 float 真值 bool 字符串 str 列表 list       #[1,2,3] 元组 tuple    #(1,2,3) 字典 dict   ...

  10. 心急的C小加

    描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果 第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则 ...