记录一下学习Hibernate的心得

1.为什么HIbernate会支持原生态的sql查询?

HQL查询语句虽然方便我们查询,但是基于HQL的查询会将查询出来的对象保存到hibernate的缓存当中,如果在我们的一个大型项目中(数据量超过了百万级),这个时候如果使用hibernate的HQL查询的话,会一次将我们查询的对象查询出来后放到缓存中,这个时候会影响我们的效率,所以当在大型项目中使用hibernate时我们的最佳实践就是--使用原生的SQL查询语句,因为通过SQL查询的话,是不会经过hibernate的缓存的。

2.如何使用?

1.返回sql查询的所有字段

  1.   /**
  2. * 作用:查所有字段
  3. * 说明:数据库的字段值是保存在一个Object[]数组中的,数组中的每个元素就是查询出来的user50表中的每个字段值
  4. */
  5.  
  6. String sql = "select * from user50";
  7. SQLQuery sqlQuery = session.createSQLQuery(sql);
  8. List<Object[]> list = sqlQuery.list();
  9. for (Object[] objects : list) {
  10. for (Object object : objects) {
  11. System.out.println(object);
  12. }
  13. }

2.返回部分字段

  1.   /**
  2. * 作用:在所有字段中取部分字段
  3. * 说明:通过addScalar()方法设置返回的字段和字段对应的类型
  4. */
  5. String sql = "select * from user50";
  6. SQLQuery sqlQuery = session.createSQLQuery(sql);
  7. List<Object[]> list = sqlQuery.addScalar("id", Hibernate.INTEGER)
  8. .addScalar("name", Hibernate.STRING)
  9. .list();

3.返回一个实体对象

  1.   /**
  2. * 作用:返回一个实体对象
  3. * 说明:通过addEntity(),指明实体对象,
  4. * 这个类必须是实体类,即加了@Entity注解或者在XML中配置了实体类
  5. * 这时,会首先匹配对象里面的属性是否全部查询出来,如果没有,则报错(如果这个类是实体类)
  6. *
  7. * 结果如下:
  8. * User [userID=1, name=zhangjifeng, age=18, birthday=2016-07-26]
  9. User [userID=2, name=liujiwang, age=18, birthday=2016-07-26]
  10. */
  11.  
  12. String sql = "select * from user50";
  13. SQLQuery sqlQuery = session.createSQLQuery(sql);
  14. List<User> list = sqlQuery.addEntity(User.class).list();
  15. for (User user : list) {
  16. System.out.println(user);
  17. }

4.返回多个实体

  1.    /**
  2. * 作用:表连接,返回多个实体,
  3. * 说明:使用占位符:{},解决多张表中有相同的字段:比如user50和order50都有name字段
  4. */
  5. String sql = "select {u.*}, {o.*} from user50 u left join order50 o on u.id=o.user_id";
  6. SQLQuery sqlQuery = session.createSQLQuery(sql);
  7. sqlQuery.addEntity("u", User.class);
  8. sqlQuery.addEntity("o", Order.class);
  9. List<Object[]> list = sqlQuery.list();
  10. for (Object[] objects : list) {
  11. User user = (User)objects[0];
  12. Order order = (Order)objects[1];
  13. System.out.println(user);
  14. System.out.println(order);
  15. }

5.返回的数据存入非实体对象中

首先需要创建一个数据传输对象,如下:

  1. package com.c50.entity.single;
  2. /**
  3. * 数据传输对象DTO
  4. */
  5. public class DTO {
  6.  
  7. private Integer id;//用户id
  8. private Integer price; //订单价格
  9.  
  10. public DTO() {
  11. super();
  12. }
  13. public DTO(Integer id, Integer price) {
  14. super();
  15. this.id = id;
  16. this.price = price;
  17. }
  18. public Integer getId() {
  19. return id;
  20. }
  21.  
  22. public void setId(Integer id) {
  23. this.id = id;
  24. }
  25.  
  26. public Integer getPrice() {
  27. return price;
  28. }
  29.  
  30. public void setPrice(Integer price) {
  31. this.price = price;
  32. }
  33.  
  34. @Override
  35. public String toString() {
  36. return "DTO [id=" + id + ", price=" + price + "]";
  37. }
  38. }

下面是查询方法:

  1. /**
  2. * 作用:返回不受hibernate管理的实体对象
  3. * 说明:将多个表中的部分字段查询出来,然后存放到一个javabean对象中,但是我们的这个bean对象又不需要存放到数据库,不需要设置成实体映射对象
  4. * 这个时候我们往往会创建一个 DTO 的数据传输对象来存放我们要储存的属性,例如定义了一个 DTO对象
  5. * 通过调用setResultTransformer(Transformers.aliasToBean(DTO.class)) 返回一个DTO对象
  6. * 输出结果如下:
  7. * DTO [id=1, price=100]
  8. DTO [id=1, price=200]
  9. DTO [id=2, price=300]
  10. *
  11. */
  12.  
  13. @Test
  14. public void testSQL6(){
  15. //获得连接
  16. Session session = HibernateUtil.getCurrentSession();
  17. //开启事务
  18. Transaction tx = session.beginTransaction();
  19. //业务
  20. String sql = "select u.id, o.price from user50 u left join order50 o on u.id=o.user_id";
  21. SQLQuery sqlQuery = session.createSQLQuery(sql);
  22. sqlQuery.addScalar("id", Hibernate.INTEGER);
  23. sqlQuery.addScalar("price", Hibernate.INTEGER);
  24. sqlQuery.setResultTransformer(Transformers.aliasToBean(DTO.class));
  25. List<DTO> list = sqlQuery.list();
  26. for (DTO userDTO : list) {
  27. System.out.println(userDTO);
  28. }
  29. //提交事务
  30. tx.commit();
  31. }

Hibernated的sql查询的更多相关文章

  1. SQL常见优化Sql查询性能的方法有哪些?

    常见优化Sql查询性能的方法有哪些? 1.查询条件减少使用函数,避免全表扫描 2.减少不必要的表连接 3.有些数据操作的业务逻辑可以放到应用层进行实现 4.可以使用with as 5.使用“临时表”暂 ...

  2. 记一个简单的sql查询

    在我们做各类统计和各类报表的时候,会有各种各样的查询要求.条件 这篇主要记录一个常见的统计查询 要求如下: 统计一段时间内,每天注册人数,如果某天没有人注册则显示为0 现在建个简单的表来试试 建表语句 ...

  3. Oracle常用SQL查询(2)

    三.查看数据库的SQL 1 .查看表空间的名称及大小 select  t.tablespace_name,  round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...

  4. MySQL GROUP_CONCAT函数使用示例:如何用一个SQL查询出一个班级各个学科第N名是谁?

    如何用一个SQL查询出一个班级各个学科第N名是谁? 首先贴出建表语句,方便大家本地测试: -- 建表语句 CREATE TABLE score ( id INT NOT NULL auto_incre ...

  5. SQL查询第m条到第n条的方法

    SQL查询第m条到第n条的方法 如表名为GOOD Sselect top (n-m) * from GOODS where (某一列名) not in (select top m (某一列名) fro ...

  6. Thinkphp查询 1.查询方式 2.表达式查询 3.快捷查询 4.区间查询 5.组合查询 6.统计查询 7.动态查询 8.SQL 查询

    1.使用字符串作为条件查询 $user = M('User'); var_dump($user->where('id=1 AND user="蜡笔小新"')->sele ...

  7. slick for play 使用原生sql查询以及拼接sql

    在play中用函数式框架slick来操作数据库是一件很爽的事情.但有时因为某些特殊场景又不得不用原生的sql了. 还好slick支持这种写法,可以看看slick官方文档,Slick Plain SQL ...

  8. SQL查询每个表的字段数量

    --SQL查询每个表的字段数量select b.[name], count(*) As AllCount,ISNULL(ISNULL(sum(case when isnullable=0 then 1 ...

  9. SQL查询关于相对路径、矢代、绝对路径、递归、计算列的速度对比跟优化-SOD群记录

    1秒查原本递归的查询. 适用于:上下级.多层查询 -- Get childs by parent id WITH Tree AS ( SELECT Id,ParentId FROM dbo.Node ...

随机推荐

  1. Configure Ocserv on CentOS 6

    Configure Ocserv on CentOS 6 Table of Contents 1. Install ocserv 2. Configure ocserv 3. How to host ...

  2. (转)linux下vi命令大全

    http://www.cnblogs.com/88999660/articles/1581524.html 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n ...

  3. sql中in和exists效率问题 转自百度知道

    in和existsin 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询. 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询 ...

  4. Javascript的DOM操作 - 你真的了解吗?

    摘要 想稍微系统的说说对于DOM的操作,把Javascript和jQuery常用操作DOM的内容归纳成思维导图方便阅读,同时加入性能上的一些问题. 前言 在前端开发的过程中,javascript极为重 ...

  5. JProfiler学习笔记

    JProfiler学习笔记   一.安装JProfiler        从http://www.ej-technologies.com/下载5.1.2并申请试用序列号   二.主要功能简介 1.内存 ...

  6. Visual Studio各版本工程文件之间的转换

    转载于:http://www.cnblogs.com/jmliao/p/5594179.html 由于VS版本比较多,低版本无法直接打开高版本的工程文件,通过对工程文件进行一些修改可以解决这些问题. ...

  7. Regression analysis

    Source: http://wenku.baidu.com/link?url=9KrZhWmkIDHrqNHiXCGfkJVQWGFKOzaeiB7SslSdW_JnXCkVHsHsXJyvGbDv ...

  8. 5 个最好的3D游戏开发工具(转)

    转自:http://www.open-open.com/news/view/33a4f0 5 个最好的3D游戏开发工具 jopen 2012-11-19 22:56:21 • 发布 摘要:UDK(th ...

  9. IO调度器(二) IO的中断返回

    IO的中断返回也是相当让人激动的一件事情: 28470  1)               |        handle_irq() { 28471  1)   0.237 us    |      ...

  10. centos6下安装dedecms

    几经波折,终于安装成功!!! 一.centos6下安装WDCP 1.连接linux 在百度直接搜索下载xshell,通过ssh连接 2.安装wdcp 下载安装wget http://dl.wdlinu ...