hibernate的hql查询语句总结
这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利。
在这里通过定义了三个类,Special、Classroom、Student来做测试,Special与Classroom是一对多,Classroom与Student是一对多的关系,这里仅仅贴出这三个bean的属性代码:
Special类:
public class Special
{
private int id;
private String name;
private String type;
private Set<Classroom> rooms;
..........
}
Classroom类:
public class Classroom
{
private int id;
private String name;
private Special special;
private Set<Student> students;
............
}
Student类:
public class Student
{
private int id;
private String name;
private String sex;
private Classroom room;
..........
}
1.最简单的查询
List<Special> specials = (List<Special>)session.createQuery("select spe from Special spe").list();
这是hql最基本的查询语句了,作用就是查出所有的Special对象放到一个List当中
2.基于 ? 的参数化形式
/**
* 查询中使用?,通过setParameter的方式可以防止sql注入
* jdbc的setParameter的下标从1开始,hql的下标从0开始
*/
List<Student> students = (List<Student>)session.createQuery("select stu from Student stu where name like ?")
.setParameter(0, "%刘%")
.list();
在hql中同样支持基于 ? 的参数化形式查询,注意:在jdbc中,setParameter的下标是从1开始的,而hibernate的setParameter的下标是从0开始的。
3.基于 :xx 的别名的方式设置参数
/**
* 在hql中可以使用别名的方式来查询,格式是 :xxx 通过setParameter来设置别名
*/
List<Student> students = (List<Student>)session.createQuery("select stu from Student stu where name like :name and sex like :sex")
.setParameter("name", "%王%").setParameter("sex", "%男%")
.list();
4.如果返回的值只有一个,可以使用uniqueResult方法
/**
* 如果得到的值只有一个,则可以使用uniqueResult方法
*/
Long stu = (Long)session.createQuery("select count(*) from Student stu where name like :name and sex like :sex")
.setParameter("name", "%王%").setParameter("sex", "%男%")
.uniqueResult(); /**
* 如果得到的值只有一个,则可以使用uniqueResult方法
*/
Student stu = (Student)session.createQuery("select stu from Student stu where id = ?")
.setParameter(0, 1)
.uniqueResult();
5.基于投影的查询
/**
* 基于投影的查询,如果返回多个值,这些值都是保存在一个object[]数组当中
*/
List<Object[]> stus = (List<Object[]>)session.createQuery("select stu.name, stu.sex from Student stu where name like
:name and sex like :sex")
.setParameter("name", "%张%").setParameter("sex", "%男%")
.list();
6.基于导航对象的查询
/**
* 如果对象中有导航对象,可以直接通过对象导航查询
*/
List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where stu.room.name like :room and sex like :sex")
.setParameter("room", "%计算机应用%").setParameter("sex", "%女%")
.list();
注意:若直接通过导航对象来查询时,其实际是使用cross join(笛卡儿积)来进行连接查询,这样做性能很差,不建议使用
7.使用 in 进行列表查询
/**
* 可以使用in设置基于列表的查询,使用in查询时需要使用别名来进行参数设置,
* 通过setParameterList方法即可设置,在使用别名和?的hql语句查询时,?形式的查询必须放在别名前面
*/
// List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where sex like ? and stu.room.id in (:room)")
// .setParameter(0, "%女%").setParameterList("room", new Integer[]{1, 2})
// .list();
List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where stu.room.id in (:room) and stu.sex like :sex")
.setParameterList("room", new Integer[]{1, 2}).setParameter("sex", "%女%")
.list();
在使用 in 进行列表查询时,这个时候要通过 setParameterList() 方法来设置我们的参数,注意:如果一个参数通过别名来传入,一个是通过 ? 的方式来传入的话,那么通过别名的hql语句以及参数设置语句要放在 ? 的后面,不然hibernate会报错。如果都是使用 别名 来设置参数,则无先后顺序
8.分页查询
/**
* 通过setFirstResult(0).setMaxResults(10)可以设置分页查询,相当于offset和pagesize
*/
List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where stu.room.name like :room and sex like :sex")
.setParameter("room", "%计算机应用%").setParameter("sex", "%女%").setFirstResult(0).setMaxResults(10)
.list();
9.内连接查询
/**
* 使用对象的导航查询可以完成连接查询,但是使用的是Cross Join(笛卡儿积),效率不高,所以建议使用join来查询
*/
List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu join stu.room room where room.id=2")
.list();
在hql中使用连接查询的语句与我们的sql进行连接查询的语句是有区别的:
hql: select stu from Student stu join stu.room room sql: select t.* from Student t join Classroom c on t.cid=c.id
10.左外连和右外连查询
/**
* 左外连和右外连其实是相对的,left join 就是以左边的表为基准, right join 就是以右边的表为基准
*/
List<Object[]> stus = (List<Object[]>)session.createQuery("select room.name, count(stu.room.id) from Student stu right join stu.room room group by room.id")
.list();
11.创建DTO类,将查询出来的多个字段可以存放到DTO对象中去
/**
* 当如果我们查询出多个字段的话,通常会创建一个DTO对象,用来存储我们查询出来的数据,通过 new XXX() 这样的方式
* 前提是XXX这个类里面必须要有接受这些字段的构造方法才行,而且必须要使用类的全名
*/
// List<Object[]> stus = (List<Object[]>)session.createQuery("select stu.id,stu.name,stu.sex,room.name,special.name from Student stu left join stu.room room left join room.special special")
// .list();
// for(Object[] obj : stus)
// {
// System.out.println(obj[0] + ", " + obj[1] + ", " + obj[2] + ", " + obj[3] + ", " + obj[4]);
// } List<StudentDTO> stus = (List<StudentDTO>)session.createQuery("select new com.xiaoluo.bean.StudentDTO(stu.id, stu.name, stu.sex, room.name, special.name) from Student stu left join stu.room room left join room.special special")
.list();
12.group having字句
/**
* 在hql中不能通过给查询出来的字段设置别名,别名只能设置在from 后面
*/
List<Object[]> stus = (List<Object[]>)session.createQuery("select special.name, count(stu.room.special.id) from Student stu right join stu.room.special special group by special.id having count(stu.room.special.id)>150")
.list(); // 查询出人数大于150个人的专业
// 查询出每个专业中男生与女生的个数
List<Object[]> stus = (List<Object[]>)session.createQuery("select special.name, stu.sex, count(stu.room.special.id) from Student stu right join stu.room.special special group by special.id,stu.sex")
.list();
基本上用到的hql查询语句就是这些,以后若再遇到会进行补充。
hibernate的hql查询语句总结的更多相关文章
- Hibernate HQL查询语句总结
Hibernate HQL查询语句总结 1. 实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql="from User user ";L ...
- HQL查询语句
查询语言 Hibernate 查询语言(HQL)是一种面向对象的查询语言,类似于 SQL,但不是去对表和列进行操作,而是面向对象和它们的属性. HQL 查询被 Hibernate 翻译为传统的 SQL ...
- hibernate的hql查询
1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...
- Hibernate的基本查询语句
1.最简单的查询 List<Special> specials = (List<Special>)session.createQuery("select spe fr ...
- Hibernate之HQL查询
一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...
- Hibernate五 HQL查询
HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...
- Hibernate 的hql查询简介【申明:来源于网络】
Hibernate 的hql查询简介[申明:来源于网络] Hibernate 的hql查询简介:http://blog.csdn.net/leaf_130/article/details/539329 ...
- Hibernate学习之hql查询语句
* 页面上数据的字段和数据库中字段差不多,这个时候,采用迫切连接 结构比较好,如果页面上的字段很少,要按照需求加载数据,采用带构造函数的select查询 实例讲解:转自:http://www.cn ...
- JavaWeb_(Hibernate框架)Hibernate中数据查询语句HQL基本用法
HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似. 在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式. ...
随机推荐
- ASP.NET Hashtable输出JSON格式数据
最近在开发Windows8 Metro App,使用JavaScript和HTML开发环境.所以操作数据绑定都是使用JSON格式数据.后台使用的是ASP.NET,因为项目相对较小,所有后台没有使用数据 ...
- ubuntu建立快捷方式
拷贝一下文件到新的文件里 [Desktop Entry]Categories=Development;Comment[zh_CN]=Comment=Exec=/usr/local/idea-IU-17 ...
- linux下jdk_tomcat+mysql配置那点事
(1)上传环境压缩包 apache-tomcat-7.0.47.tar.gz, jdk-7u71-linux-x64.gz, mysql-5.6.14.tar.gz通过xftp工具上传到/usr/lo ...
- SourceTree安装教程
一.安装Git 链接: http://pan.baidu.com/s/1mh7rICK 密码: 48dj 二.安装SourceTree 链接: http://pan.baidu.com/s/1skWk ...
- recordMyDesktop的安装与使用
今天给大家推荐一款能让桌面录像更简单的屏幕录像的工具: RecordMyDesktop 安装 RecordMyDesktop RecordMyDesktop 的核心是一系列命令工具,不过 Gnome ...
- Android玩转百度地图Sha1获取正确姿势?
场景一 由于近期项目钟要用到定位功能因此肯定须要用到地图以及地位功能,相信大家也知道眼下国内比較出名的地图像百度.高德.腾讯等这些还是用到比較多的.于是思考了一下决定还是用百度,相信老司机们都知道的哈 ...
- java 怎么打印变量
//Test.java public class Test16{ public static void main(String args[]){ int age=28; System.out.prin ...
- Centos7.4下keepalived-1.3.5的安装使用
keepalived两个功能,一个是使lvs使用的vip高可用,一个是监控下游各个子节点的对应端口是否正常工作,以保证快速剔除坏掉的节点. keepalived默认的yum 1.3.5有BUG,根本跑 ...
- cmd 运行(打包后的)java程序
package cn.imeixi.chapter1.exer; public class Exer10PrintArgs { public static void main(String[] arg ...
- Qt5中创建临时的后台线程。
有个需求就是,GUI图形界面在上传文件到服务器的时候,需要用zip命令行打包,因为文件很多的时候,zip命令打包需要计算很长时间,所以把这样计算量大的任务分离到后台线程比较合适,然后任务完成,以信号槽 ...