hibernate查询的方式和变量
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,如果返回值不唯一,则抛出异常
1 Object name= session.createQuery(hql).uniqueResult();
2 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查询的方式和变量的更多相关文章
- hibernate查询方式
hibernate查询方式:1.本地SQL查询 2.HQL查询 3.QBC查询 HQL查询:是面向对象的查询语言,是使用最广的一种查询方法 QBC查询:Query by Criteria是一套接口来实 ...
- (十)Hibernate 查询方式
所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:Hibernate 查询方式简介 1,导航对象图查询方式: 2 ...
- 六种方式实现hibernate查询
最近在学习Hibernate的基本内容,刚好在项目中有用到,基本上都是用到哪就学哪. 今天看看六种方式实现hibernate查询......... 分别是HQL查询,对象化查询Criteria方法,动 ...
- Hibernate查询方式(补)
-----------------siwuxie095 Hibernate 查询方式 1.对象导航查询 根据已经加载的对 ...
- Redis查询&JDBC查询&Hibernate查询方式的效率比较...
比较三种查询方式查询效率对比...我是用的JavaWeb的方式通过通过JSP页面查询的填写查询的参数...给予反馈.... 整个demo的下载地址:http://files.cnblogs.com/f ...
- Hibernate查询的六种方式
Hibernate查询的六种方式 分别是HQL查询,对象化查询Criteria方法,动态查询DetachedCriteria,例子查询,sql查询,命名查询. 如果单纯的使用hibernate ...
- Hibernate学习10——Hibernate 查询方式
本章主要是以查询Student的例子: Student.java: package com.cy.model; public class Student { private int id; priva ...
- Hibernate的查询的方式
Hibernate的查询的方式 在Hibernate中提供了很多种的查询的方式.Hibernate共提供了五种查询方式. Hibernate的查询方式:OID查询 OID检索:Hibernate根据对 ...
- Hibernate 查询方式、JPA查询方式
hibernate 查询方式: OID 查询 对象导航查询 HQL 方式查询 QBC方式查询 原生SQL方式查询 JPA 查询方式: OID 查询 对象导航查询 JPQL 方式查询 CriteriaB ...
随机推荐
- 第一天 格式化操作符 条件、for、while、break、continue语句
python2和3的区别: 2中的print 不必加括号 3中的print变为函数 要加括号 2中的input不能输入字母(输入的字母被认为是变量,而之前又没定义,所以报错),默认只能计算数字,要 ...
- Delphi程序的自动升级功能的实现(AutoUpdate使用指南)
在UtiMnid组件下,利用auAutoUpgrader实现自动升级(已经测试通过) 第一步:下载AutoUpgrader.Pro.v4.6.4. 第二步:打开AutoUpgrader.Pro.v4. ...
- 浅谈WebService开发(一)
一.什么是WebService: 简单通俗来说,就是企业之间.网站之间通过Internet来访问并使用在线服务,一些数据,由于安全性问题,不能提供数据库给其他单位使用,这时候可以使 用WebSer ...
- Java_注解_00_资源贴
1.Java注解教程:自定义注解示例,利用反射进行解析 2. (1)深入理解Java:注解(Annotation)基本概念 (2)深入理解Java:注解(Annotation)自定义注解入门 (3)深 ...
- 关于c++中局部变量和全局变量的存储位置及内存回收机制
局部变量,参数变量存放在栈中,当离开作用范围后,分配的内存在作用范围外会被系统自动回收. new出来的内存空间存放在堆中,不受作用域管理,不会被系统自动回收,只有在使用delete删除或者整个程序结束 ...
- python实现列队
1 列队定义 队列是项的有序结合,其中添加新项的一端称为队尾,移除项的一端称为队首.当一个元素从队尾进入队列时,一直向队首移动,直到它成为下一个需要移除的元素为止. 最近添加的元素必须在队尾等待.集合 ...
- YNOI2016 这是我自己的发明
看到这个标题立刻想到:. “绝地科学家,八倍不屏息啊,八百里外把头打啊...” 首先我们发现如果只考虑第二个操作,这棵树就是假的,我们可以直接莫队解决 如果考虑换根的话...可以把一个操作换成小于等于 ...
- 20179203 《Linux内核原理与分析》第十周作业
第17章 设备与模块 一.设备类型 1. Linux及Unix系统: 块设备 字符设备 网络设备 2.块设备: 通常缩写为blkdev,它是可寻址的,寻址以块为单位,块大小随设备不同而不同:块设备通常 ...
- POJ3417Network
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5311 Accepted: 1523 Descripti ...
- Netty,Netty
Windows防火墙会自动关闭空闲的TCP链接,所以Netty需要心跳,如果发现链接断开需要进行关闭Session: 怎么来理解TCP的流式传输呢? int blocksize = buffer.re ...