常用HQL(Hibernate Query Language)查询
查询一个对象(实体类必须有一个不带参数的构造方法)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@Testpublic void test01() { Session session = null; try { session = HibernateUtil.openSession(); /** * 对于HQL而言,都是基于对象进行查询的 */ Query query = session.createQuery("from Special"); List<Special> spes = query.list(); for(Special spe:spes) { System.out.println(spe.getName()); } } catch (Exception e) { e.printStackTrace(); } finally { HibernateUtil.close(session); }} |
使用select查询
|
1
2
3
4
5
6
7
8
9
|
//不能使用select *进行查询//Query query = session.createQuery("select * from Special");/** * 可以使用链式查询的方式 */List<Special> spes = session.createQuery("select spe from Special spe").list();for(Special spe:spes) { System.out.println(spe.getName());} |
条件查询
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
List<Student> stus = session .createQuery("from Student where name like '%张%'") .list();for(Student stu:stus) { System.out.println(stu.getName());}-------------------------------------------------/** * 基于?的条件的查询 * 特别注意:jdbc设置参数的最小下标是1,hibernate是0 */List<Student> stus = session .createQuery("from Student where name like ?") .setParameter(0, "%李%") .list();for(Student stu:stus) { System.out.println(stu.getName());}------------------------------------------------/** * 还可以基于别名进行查询,使用:xxx来说明别名的名称 */List<Student> stus = session .createQuery("from Student where name like :name and sex=:sex") .setParameter("name", "%刘%") .setParameter("sex", "男") .list();for(Student stu:stus) { System.out.println(stu.getName());} |
使用uniqueResult可以返回唯一的一个值/对象
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Long stus = (Long)session .createQuery("select count(*) from Student " + "where name like :name and sex=:sex") .setParameter("name", "%刘%") .setParameter("sex", "男") .uniqueResult();System.out.println(stus);------------------------------------------------------Student stu = (Student)session .createQuery("select stu from Student stu where id=:id") .setParameter("id", 1) .uniqueResult();System.out.println(stu.getName()); |
基于投影的查询,通过在列表中存储一个对象的数组
|
1
2
3
4
5
6
7
|
List<Object[]> stus = session .createQuery("select stu.sex,count(*) from Student stu " + "group by stu.sex") .list();for(Object[] obj:stus) { System.out.println(obj[0]+":"+obj[1]);} |
如果对象中相应的导航对象,可以直接导航完成查询
|
1
2
3
4
5
6
7
8
|
List<Student> stus = session .createQuery("select stu from Student stu " + "where stu.classroom.name=? and stu.name like ?") .setParameter(0, "计算机教育班").setParameter(1, "%张%") .list();for(Student stu:stus) { System.out.println(stu.getName());} |
可以使用in来设置基于列表的查询,此处的查询需要使用别名进行查询
特别注意,使用in的查询必须在其他的查询之后
|
1
2
3
4
5
6
7
8
9
|
List<Student> stus = session .createQuery("select stu from Student stu " + "where stu.name like ? and stu.classroom.id in (:clas)") .setParameter(0, "%张%") .setParameterList("clas", new Integer[]{1,2}) .list();for(Student stu:stus) { System.out.println(stu.getName());} |
使用setFirstResult和setMaxResult可以完成分页的offset和pageSize的设置
|
1
2
3
4
5
6
7
8
9
|
List<Student> stus = session .createQuery("select stu from Student stu " + "where stu.classroom.id in (:clas)") .setParameterList("clas", new Integer[]{1,2}) .setFirstResult(0).setMaxResults(15) .list();for(Student stu:stus) { System.out.println(stu.getName());} |
可以通过is null来查询为空的对象,和sql一样不能使用=来查询null的对象
|
1
2
3
4
5
6
7
8
|
List<Student> stus = session .createQuery("select stu from Student stu " + "where stu.classroom is null") .setFirstResult(0).setMaxResults(15) .list();for(Student stu:stus) { System.out.println(stu.getName());} |
连接查询
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/** * 使用对象的导航可以完成连接,但是是基于Cross JOIN,效率不高, * 可以直接使用JOIN来完成连接 */List<Student> stus = session .createQuery("select stu from Student stu " + "left join " + "stu.classroom cla where cla.id=2") .setFirstResult(0).setMaxResults(15) .list();for(Student stu:stus) { System.out.println(stu.getName());} |
统计班级学生的人数
|
1
2
3
4
5
6
7
|
List<Object[]> stus = session .createQuery("select cla.name,count(stu.classroom.id) from Student stu " + "right join stu.classroom cla group by cla.id") .list();for(Object[] stu:stus) { System.out.println(stu[0]+","+stu[1]);} |
把查询出来的数据封装成一个对象。
定义一个学生对象DTO
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package org.zttc.itat.model;/** * DTO对象没有存储的意义,仅仅是用来进行数据的传输的 * */public class StudentDto { private int sid; private String sname; private String sex; private String cname; private String spename; //省去set get方法 public StudentDto(int sid, String sname, String sex, String cname,String spename) { super(); this.sid = sid; this.sname = sname; this.sex = sex; this.cname = cname; this.spename = spename; } public StudentDto() { } } |
查询
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/** * 直接可以使用new XXObject完成查询, * 注意,一定要加上Object的完整包名 * 这里使用的new XX,必须在对象中加入相应的构造函数 */List<StudentDto> stus = session .createQuery("select new org.zttc.itat.model.StudentDto" + "(stu.id as sid,stu.name as sname,stu.sex as sex," + "cla.name as cname,spe.name as spename) " + "from Student stu left join stu.classroom cla " + "left join cla.special spe") .list();for(StudentDto stu:stus) { System.out.println(stu.getSid()+","+stu.getSname()+","+ stu.getSex()+","+stu.getCname()+","+stu.getSpename());} |
having是为group来设置条件的
|
1
2
3
4
5
6
7
8
|
List<Object[]> stus = session.createQuery("select spe.name," + "(count(stu.classroom.special.id)) from Student stu right join " + "stu.classroom.special spe group by spe " + "having count(stu.classroom.special.id)>150") .list();for(Object[] obj:stus) { System.out.println(obj[0]+":"+obj[1]);} |
常用HQL(Hibernate Query Language)查询的更多相关文章
- hql(Hibernate Query Language)
1.Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate ...
- Hibernate Query Language查询:
Hibernate Query Language查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供 ...
- Hibernate查询(HQL——Hibernate Query Language)
HQL查询 HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操作.而且HQL是面向对象的,具备继承,多态和关联等特性. from子句: ...
- HQL: The Hibernate Query Language
Chapter 14. HQL: The Hibernate Query Language 14.1. Case Sensitivity 14.2. The from clause 14.3. Ass ...
- HQL基础Query简单查询结果for输出和Iterator输出
HQL第一次课: hibernate Query Language:hibernate 查询语言 语法: query: String hql="from dept"; Query ...
- HQL(Hibernate Query Language)
1. NativeSQL > HQL > EJB QL(JP QL 1.0) > QBC(Query By Criteria) > QBE(Query By Example)2 ...
- Hibernate hql(hibernate query language)基础查询
在开发过程中,数据库的操作我们其实更多的用到的是查询功能,今天开始学习hql的查询. 1.加入必要的工具 2.Hibernate配备的一种非常强大的查询语言,这种查询语言看上去很像sql.但是不要被语 ...
- HQL(Hibernate Query language)语言
现在有两张表:student(学生表),classroom(教室表). //对象 Student 对应 student 表中有四个字段,分别是:id,name,age,classroom; publi ...
- Hibernate的批量查询——HQL
HQL(Hibernate Query Language)查询: 1.查询所有学生信息: public static void testSel() { Session session = Hibern ...
随机推荐
- 开源 java CMS - FreeCMS2.2 单位管理
项目地址:http://www.freeteam.cn/ 单位管理 FreeCMS支持多单位同一时候使用,并支持无限树级管理. 1. 加入根单位 从左側管理菜单点击单位管理进入. 点击"加入 ...
- sklearn 中的交叉验证
sklearn中的交叉验证(Cross-Validation) sklearn是利用python进行机器学习中一个非常全面和好用的第三方库,用过的都说好.今天主要记录一下sklearn中关于交叉验证的 ...
- Java并发之AQS同步器学习
AQS队列同步器学习 在学习并发的时候,我们一定会接触到 JUC 当中的工具,JUC 当中为我们准备了很多在并发中需要用到的东西,但是它们都是基于AQS(AbstractQueuedSynchroni ...
- scala-trait实现AOP编程
步骤1:声明表示基本动作方法的模块Taction //声明表示基本动作方法的模块Taction trait TAction { def doAction } 步骤2:定义一下加入了前置处理和后置处理的 ...
- 使用PM2管理Node.js集群
介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心 ...
- Hadoop权威指南学习笔记一
Hadoop简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出.一起学习一起进步. 转载请注明:http://blog.csdn.net/ ...
- 完美解决 IOS系统safari5.0 浏览器页面布局iframe滚动栏失效问题
在iframe外层包一层div,加入例如以下样式: style="-webkit-overflow-scrolling:touch;overflow:auto;" 代码例如以下: ...
- 关于locate这个NB命令我不得不深入的学习
先看看locate的安装包和生成的文件: [root@NB mlocate]# which locate /usr/bin/locate [root@NB mlocate]# rpm -qf /usr ...
- 提取ipa里面的资源图片 png
Apple 对 iPhone 应用程序中的 png 图片进行了特殊的处理,在 png 文件头之后加了一个非标准的 CgBI 数据段,IDAT 段图像数据也没有传统的压缩数据头和尾,并且红色和蓝色是反的 ...
- 《SPARK/TACHYON:基于内存的分布式存储系统》-史鸣飞(英特尔亚太研发有限公司大数据软件部工程师)
史鸣飞:大家好,我是叫史鸣飞,来自英特尔公司,接下来我向大家介绍一下Tachyon.我事先想了解一下大家有没有听说过Tachyon,或者是对Tachyon有没有一些了解?对Spark呢? 首先做一个介 ...