Hibernated的sql查询
记录一下学习Hibernate的心得
1.为什么HIbernate会支持原生态的sql查询?
HQL查询语句虽然方便我们查询,但是基于HQL的查询会将查询出来的对象保存到hibernate的缓存当中,如果在我们的一个大型项目中(数据量超过了百万级),这个时候如果使用hibernate的HQL查询的话,会一次将我们查询的对象查询出来后放到缓存中,这个时候会影响我们的效率,所以当在大型项目中使用hibernate时我们的最佳实践就是--使用原生的SQL查询语句,因为通过SQL查询的话,是不会经过hibernate的缓存的。
2.如何使用?
1.返回sql查询的所有字段
/**
* 作用:查所有字段
* 说明:数据库的字段值是保存在一个Object[]数组中的,数组中的每个元素就是查询出来的user50表中的每个字段值
*/
String sql = "select * from user50";
SQLQuery sqlQuery = session.createSQLQuery(sql);
List<Object[]> list = sqlQuery.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.println(object);
}
}
2.返回部分字段
/**
* 作用:在所有字段中取部分字段
* 说明:通过addScalar()方法设置返回的字段和字段对应的类型
*/
String sql = "select * from user50";
SQLQuery sqlQuery = session.createSQLQuery(sql);
List<Object[]> list = sqlQuery.addScalar("id", Hibernate.INTEGER)
.addScalar("name", Hibernate.STRING)
.list();
3.返回一个实体对象
/**
* 作用:返回一个实体对象
* 说明:通过addEntity(),指明实体对象,
* 这个类必须是实体类,即加了@Entity注解或者在XML中配置了实体类
* 这时,会首先匹配对象里面的属性是否全部查询出来,如果没有,则报错(如果这个类是实体类)
*
* 结果如下:
* User [userID=1, name=zhangjifeng, age=18, birthday=2016-07-26]
User [userID=2, name=liujiwang, age=18, birthday=2016-07-26]
*/
String sql = "select * from user50";
SQLQuery sqlQuery = session.createSQLQuery(sql);
List<User> list = sqlQuery.addEntity(User.class).list();
for (User user : list) {
System.out.println(user);
}
4.返回多个实体
/**
* 作用:表连接,返回多个实体,
* 说明:使用占位符:{},解决多张表中有相同的字段:比如user50和order50都有name字段
*/
String sql = "select {u.*}, {o.*} from user50 u left join order50 o on u.id=o.user_id";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addEntity("u", User.class);
sqlQuery.addEntity("o", Order.class);
List<Object[]> list = sqlQuery.list();
for (Object[] objects : list) {
User user = (User)objects[0];
Order order = (Order)objects[1];
System.out.println(user);
System.out.println(order);
}
5.返回的数据存入非实体对象中
首先需要创建一个数据传输对象,如下:
package com.c50.entity.single;
/**
* 数据传输对象DTO
*/
public class DTO {
private Integer id;//用户id
private Integer price; //订单价格
public DTO() {
super();
}
public DTO(Integer id, Integer price) {
super();
this.id = id;
this.price = price;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
@Override
public String toString() {
return "DTO [id=" + id + ", price=" + price + "]";
}
}
下面是查询方法:
/**
* 作用:返回不受hibernate管理的实体对象
* 说明:将多个表中的部分字段查询出来,然后存放到一个javabean对象中,但是我们的这个bean对象又不需要存放到数据库,不需要设置成实体映射对象
* 这个时候我们往往会创建一个 DTO 的数据传输对象来存放我们要储存的属性,例如定义了一个 DTO对象
* 通过调用setResultTransformer(Transformers.aliasToBean(DTO.class)) 返回一个DTO对象
* 输出结果如下:
* DTO [id=1, price=100]
DTO [id=1, price=200]
DTO [id=2, price=300]
*
*/
@Test
public void testSQL6(){
//获得连接
Session session = HibernateUtil.getCurrentSession();
//开启事务
Transaction tx = session.beginTransaction();
//业务
String sql = "select u.id, o.price from user50 u left join order50 o on u.id=o.user_id";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addScalar("id", Hibernate.INTEGER);
sqlQuery.addScalar("price", Hibernate.INTEGER);
sqlQuery.setResultTransformer(Transformers.aliasToBean(DTO.class));
List<DTO> list = sqlQuery.list();
for (DTO userDTO : list) {
System.out.println(userDTO);
}
//提交事务
tx.commit();
}
Hibernated的sql查询的更多相关文章
- SQL常见优化Sql查询性能的方法有哪些?
常见优化Sql查询性能的方法有哪些? 1.查询条件减少使用函数,避免全表扫描 2.减少不必要的表连接 3.有些数据操作的业务逻辑可以放到应用层进行实现 4.可以使用with as 5.使用“临时表”暂 ...
- 记一个简单的sql查询
在我们做各类统计和各类报表的时候,会有各种各样的查询要求.条件 这篇主要记录一个常见的统计查询 要求如下: 统计一段时间内,每天注册人数,如果某天没有人注册则显示为0 现在建个简单的表来试试 建表语句 ...
- Oracle常用SQL查询(2)
三.查看数据库的SQL 1 .查看表空间的名称及大小 select t.tablespace_name, round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...
- MySQL GROUP_CONCAT函数使用示例:如何用一个SQL查询出一个班级各个学科第N名是谁?
如何用一个SQL查询出一个班级各个学科第N名是谁? 首先贴出建表语句,方便大家本地测试: -- 建表语句 CREATE TABLE score ( id INT NOT NULL auto_incre ...
- SQL查询第m条到第n条的方法
SQL查询第m条到第n条的方法 如表名为GOOD Sselect top (n-m) * from GOODS where (某一列名) not in (select top m (某一列名) fro ...
- Thinkphp查询 1.查询方式 2.表达式查询 3.快捷查询 4.区间查询 5.组合查询 6.统计查询 7.动态查询 8.SQL 查询
1.使用字符串作为条件查询 $user = M('User'); var_dump($user->where('id=1 AND user="蜡笔小新"')->sele ...
- slick for play 使用原生sql查询以及拼接sql
在play中用函数式框架slick来操作数据库是一件很爽的事情.但有时因为某些特殊场景又不得不用原生的sql了. 还好slick支持这种写法,可以看看slick官方文档,Slick Plain SQL ...
- SQL查询每个表的字段数量
--SQL查询每个表的字段数量select b.[name], count(*) As AllCount,ISNULL(ISNULL(sum(case when isnullable=0 then 1 ...
- SQL查询关于相对路径、矢代、绝对路径、递归、计算列的速度对比跟优化-SOD群记录
1秒查原本递归的查询. 适用于:上下级.多层查询 -- Get childs by parent id WITH Tree AS ( SELECT Id,ParentId FROM dbo.Node ...
随机推荐
- java报表工具FineReport的SQL编辑框的语法简介
感谢大家捧场,这里继续分享关于SQL编辑框的一些语法心得总结,因为数据集定义的面板,也是FineReport报表中最常用的模块之一. 1.我理解的执行过程. 这里其实是生成一个字符串,FineRepo ...
- AI (Adobe Illustrator)详细用法(一)
一.新建文档 1.设置面板的各项参数 双击面板工具,会弹出“画板选项”窗口.画板就是最终会被输出的地方. 2.文档设置 文档设置好了以后,可以修改,在文件——>文档设置中打开修改. 二.界面设置 ...
- html5语法
html5语法沿用html语法,但更简单,更人性化. 一.DOCTYPE及字符编码 DOCTYPE:<!doctype html>或者<!DOCTYPE html>因为html ...
- java使用IO读写文件总结
每次用到IO的读写文件都老忘记写法,都要翻过往笔记,今天总结下,省的以后老忘.java读写文件的IO流分两大类,字节流和字符流,基类分别是字符:Reader和Writer:字节:InputStream ...
- (七)中介者模式-C++实现
用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其解耦合松散而且可以独立地改变他们之间的交互. 中介者模式适合于 系统中不希望对象之间直接交互,即不希望类之间相互包含, ...
- hdu-5127------hdu5137
hdu-5127 思路: 本来正解好像是动态凸包,暴力10000+ms可以搞过去; hdu-5128 思路: 枚举两个长方形的对角线,然后判断是否不相交,更新答案就好; hdu-5130 思路: 将题 ...
- JavaScript语言精粹笔记
JavaScript语言精粹笔记 掌握语言的每个特性可以让你出风头,但是并不推荐,因为一部分的特性带来的麻烦可能远超本身的价值.正如书中所言,坏的材料并不能雕刻出好的作品,要成为一名更好的程序员,要取 ...
- java 22 - 14 JDK1.5以后的Lock锁
在之前解决线程安全的过程中,虽然我们可以理解同步代码块和同步方法的锁对象问题, 但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁, 为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对 ...
- poj2580 Super Memmo
Description Your friend, Jackson is invited to a TV show called SuperMemo in which the participant i ...
- Json 基于jQuery+JSON的省市联动效果
helloweba.com 作者:月光光 时间:2012-09-12 21:57 标签: jQuery JSON Ajax 省市联动 省市区联动下拉效果在WEB中应用非常广泛,尤其在一些 ...