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 ...
随机推荐
- shell脚本学习指南
一.UNIX各个工具所支持的正则表达式: 二.使用sed在某一目录下建立一份目录备份: find /home/foo/ -type d -print | #找出/home/foo/目录下所有目录文件 ...
- System.getProperty()引起的悲剧--您的主机中的软件中止了一个已建立的连接
我已无法形容此刻我的心情.. 本来是已经写好的netty5的demo程序,server和client之间创建tcp长连接的..然后随便传点数据的简单demo..然后今天试了一下tcp粘包的例子,用到了 ...
- 关于TD-LTE网络MRO分析中的一些疑问
1.eNB天线到达角(LteScAOA)超出正常值范围 在OMC-R测量报告技术要求中此字段的定义为: "定义了一个用户相对参考方向的估计角度.测量参考方向应为正北,逆时针方向.可以辅助确定 ...
- POJ 1066 Treasure Hunt【线段相交】
思路:枚举四边墙的门的中点,与终点连成一条线段,判断与其相交的线段的个数.最小的加一即为答案. 我是傻逼,一个数组越界调了两个小时. #include<stdio.h> #include& ...
- POJ3107Godfather[树形DP 树的重心]
Godfather Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6121 Accepted: 2164 Descrip ...
- NOIP2003pj数字游戏[环形DP]
题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分 ...
- java 28 - 4 JDK5的新特性 之 枚举的概述和自定义枚举类
枚举 枚举概述 是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.举例:一周只有7天,一年只有12个月等. 回想单例设计模式:单例类是一个类只有一个实例 那么多例类就是一个类有多个实例,但 ...
- javascript里面this机制的几个例子
javascript里面的this值会随着使用场景的不同二发生变化,但是总有一个原则,那就是this总指向当前调用函数的那个对象.以下我会举几个例子来说明这个问题.1.this本身总是指向当前的类的实 ...
- Oracle死锁查询及处理
一.数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错.二.死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更 ...
- Frequently Asked Questions - P-thresholds
Source: http://mindhive.mit.edu/book/export/html 1. What is the multiple-comparison problem? What is ...