Hibernate HQL详解
版权声明:本文为博主原创文章,如需转载请标注转载地址。
博客地址:http://www.cnblogs.com/caoyc/p/5606444.html
1、实体查询:
hql="FROM User";
List list= session.createQuery(hql).list();
for(Object obj:list){
System.out.println(obj);
}
【注意】:HQL语句中关键字不区分大小写,但是实体类和对象属性要区分大小写
2、查询某个对象的某个属性
hql="SELECT name FROM User where id=1";
方式一:
Object name= session.createQuery(hql).list().get(0);
System.out.println(name);
这种方式不被推荐,当如果id=0的User对象不存在是,使用get(0)会抛出异常,我们通常使用下面这种方式
方式二:通过uniqueResult()方法,该方法返回一个Object对象,如果对象不存在则返回null,如果返回值不唯一,则抛出异常
Object name= session.createQuery(hql).uniqueResult();
System.out.println(name)
3、查询其中几列数据,返回一个数组
hql="SELECT id,name FROM User";
List list= session.createQuery(hql).list();
for(Object obj:list){
System.out.println(Arrays.toString((Object[])obj));
}
list()返回的是一个List<Object>对象
4、查询其中几列数据,返回一个实体类
hql="SELECT new User(id,name) FROM User";
List<User> list= session.createQuery(hql).list();
for(User user:list){
System.out.println(user);
}
HQL通过new的方式可以返回一个新的实体类,比如说上面通过new User(id,name)方式将id,name返回给User,要求User必须包含一个相对应的构造函数,否则会抛出异常,同时我们还有应该给User指定一个默认的构造函数,否则使用From User也会抛出异常,因为这种方式采用的是默认构造。值得注意的是,如果使用的新构造对象,那么处理指定的属性会被赋予新值外,其它属性均为默认值。
5、WHER、GROUP BY、HAVING和ORDER综合使用
hql="SELECT age, COUNT(age) num FROM User WHERE age>10 GROUP BY age HAVING COUNT(age)>1 ORDER BY num DESC";
在HAVING中,不能使用别名num,但在ORDER BY中可以使用别名num
6、使用占位符"?"
hql="FROM User where id=?";
User user= (User)session.createQuery(hql)
.setParameter(0, 2)
.uniqueResult();
System.out.println(user);
Hibernate和JDBC占位符的区别:在Hibernate占位符下标从0开始,在JDBC中的占位符下标从1开始
7、使用参数
hql="FROM User where id=:id";
User user= (User)session.createQuery(hql)
.setParameter("id", 2)
.uniqueResult();
System.out.println(user);
使用参数的方式,在HQL中在参数前面需要加上冒号
8、使用集合或数组参数
hql="FROM User where id IN (:ids)";
List<User> list= session.createQuery(hql)
.setParameterList("ids", new Object[]{1,3,4})
.list();
for (User user : list) {
System.out.println(user);
}
9、使用命名方式查询
如果我们将HQL代码写在类中,那么编译后我们非常难以维护,为了后期代码的可维护行,我们需要将HQL代码写在对应类的.hbm.xml文件中,例如:
<query name="queryUserRanage">
FROM User WHERE id BETWEEN ? AND ?
</query>
在Java代码中
Query query=session.getNamedQuery("queryUserRanage");
List<User> list=query
.setParameter(0, 10)
.setParameter(1, 20)
.list();
for(User user:list){
System.out.println(user);
}
通常我们使用参数的方式,这样可以很直观知道每个参数的作用
<query name="queryUserRanage">
FROM User WHERE id BETWEEN :minId AND :maxId
</query>
但是如果在SQL语句中存在>、<等xml中特殊字符,这些字符在xml中都有特殊的意义,所有我们不能直接这样写
【Error】
<query name="queryUserRanage">
FROM User WHERE id > :minId AND id< :maxId
</query>
【Right】
<query name="queryUserRanage">
FROM User WHERE id > :minId AND < :maxId
</query>
虽然上面的方式我们可以正确执行,但是代码显示不够友好,所有我们推荐使用下面的一种方式
<query name="queryUserRanage">
<![CDATA[FROM User WHERE id > :minId AND < :maxId]]
</query>
CDATA代码块说明在代码中的语句不需要转义,我们一个HQL都推荐用CDATA块来包裹着
Hibernate HQL详解的更多相关文章
- hibernate Expression详解
关键字: hibernate expression hibernate Expression详解Expression.gt:对应SQL条件中的"field > value " ...
- (转)spring hibernate properties详解
转载地址:http://blog.sina.com.cn/s/blog_692d0a650100xyqx.html Hibernate配置属性 hibernate.dialect:一个Hibernat ...
- Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解
在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...
- Hibernate配置文件详解
Hibernate配置方式 Hibernate给人的感受是灵活的,要达到同一个目的,我们可以使用几种不同的办法.就拿Hibernate配置来说,常用的有如下三种方式,任选其一. 在 hibernate ...
- hibernate二级缓存ehcache hibernate配置详解
<!-----------------hibernate二级缓存ehcache------------------------->hibernate配置 <prop key=&quo ...
- Hibernate配置详解
<!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ...
- HQL详解
HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此 Hib ...
- Hibernate入门详解
学习Hibernate ,我们首先要知道为什么要学习它?它有什么好处?也就是我们为什么要学习框架技术? 还要知道 什么是Hibernate? 为什么要使用Hibernate? Hib ...
- Hibernate 配置详解(8)
hibernate.generate_statistics 这个配置大家应该都很熟悉,用于开启Hibernate统计信息,便于对Hibernate相关性能调试提供数据依据.在开发过程当中,可以把这个选 ...
随机推荐
- python 去掉换行符或者改为其他方式结尾的方法(end='')
输入参数不换行,就是打印之后不换行,在python2.7中使用 "," >>>def test(): print 'hello', print "wor ...
- 计蒜客NOIP2018模拟1
https://www.jisuanke.com/contest/1152 T1:最失败的一道题,其实就是道水题,好几种写法,一种都没想出来. 题意转化后就是:每个数可以选a[i]和a[i]-k,最后 ...
- 1.1(JavaScript学习笔记)、JavaScript基础
一.JavaScript简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型. 它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端 ...
- session cookie的区别最全总结
作为一名WEB开发程序员,对session的理解是最基础的,但是现状是WEB程序员遍地都是,随便一划拉一大把,不过估计能把session能透彻理解的人应该不是很多,起码我之前对此是知之甚少,偶然看到的 ...
- iOS获取已安装的app列表(私有库)+ 通过包名打开应用
1.获取已安装的app列表 - (void)touss { Class lsawsc = objc_getClass("LSApplicationWorkspace"); NSOb ...
- Linux下KVM虚拟机基本管理及常用命令(转)
说明:可能有重复 一.KVM的基本管理 1.查看KVM虚拟机配置文件 #Kvm虚拟机默认配置文件位置 [root@kvm qemu]# pwd /etc/libvirt/qemu [root@kvm ...
- [Android实例] 推荐给你们一个好用的ListView、RecyclerView适配器
https://github.com/vihuela/RecyclerViewHelpper 如果用过RecyclerView的人都知道,高度不会包裹,然后写法好像也不是很简洁,甚至点击事件不好设 置 ...
- JIRA Service Desk 3.9.2 没有许可证
https://my.atlassian.com/license/evaluation Server ID BFHT-0XFL-3NM8-3KRF SEN SEN-L10880225 License ...
- Unity3d设计模式之单例模式
单例模式我相信是所有设计模式之中运用最广泛的设计模式之一. 今天我们就来看看在unity中如何使用单例模式,在unity中,我们分两种单例,一种是继承monobehavior的单例,一种是普通单例. ...
- 【转载】WebStorm安装 & Nodejs-Express Demo
试试下面这个方法: http://www.sdifenzhou.com/?p=6941 从这里下载 http://pan.baidu.com/share/link?shareid=2512210975 ...