常用HQL(Hibernate Query Language)查询
查询一个对象(实体类必须有一个不带参数的构造方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@Test public 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 ...
随机推荐
- 导入sklearn 报错,找不到相关模块
1.问题原因::安装包的来源问题,也可以理解为包版本兼容问题,有的包使用官方出版,有的包使用whl文件安装解决方案:将所有包都统一来源,要么全部使用官方出版的包,要么全部使用whl里面的包,问题就解决 ...
- Windows Store Apps 开发转载
懒得写了,就直接记录转载一下文章地址吧. 如何为应用定义全局默认字体:http://blogs.msdn.com/b/gautamdh/archive/2014/03/16/how-to-change ...
- [na]win7系统安装在t450s
电脑配置 电脑型号 联想 ThinkPad T450s 笔记本电脑(最近买了个ngff口的128g的固态ssd) 操作系统 Windows 旗舰版 64位 主显卡 集成显卡 IE浏览器 版本号 8.0 ...
- Cocos2dx Label
cocos2dx3.0添加了一种新的文本标签,这种标签不同的地方有:使用freetype来使它在不同的平台上有相同的视觉效果:由于使用更快的缓存代理,它的渲染也将更加快速:同时它还提供了绘边.阴影等特 ...
- nyoj311 完全背包 经典背包问题
完全背包 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的体积是c,价值是w. ...
- pairRDD中算子reduceByKeyLocally
原型: def reduceByKeyLocally(func: (V, V) => V): Map[K, V] 该函数将RDD[K,V]中每个K对应的V值根据映射函数来运算,运算结果映射到一个 ...
- maven install 跳过test方法
方式1:用命令带上参数 mvn install -Dmaven.test.skip=true 方式2:在pom.xml里面配置 <build> <defaultGoal>com ...
- Android开发日记(五)
从服务器端传递多个数据 先在服务器端设置cs文件 using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using Syst ...
- C++中冒号和双冒号的用法
1.冒号(:)用法 (1)表示机构内位域的定义(即该变量占几个bit空间) typedef struct _XXX{ unsigned char a:4; unsigned char c; } ; X ...
- 一款基于jquery的鼠标经过图片列表特效
今天要给大家推荐一款基于jquery的鼠标经过图片列表特效.当鼠标经过列表图片的时候,图片放大,且有一个半透明的遮罩层随之移动.效果图如下: 在线预览 源码下载 实现的代码 html代码: < ...