记录一下学习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查询的更多相关文章

  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. 《Python核心编程》部分代码习题实践(持续更新)

    第三章 3-10 交换异常处理方式 代码: #makeTextFile.py #!/usr/bin/env python 'makeTextFile.py' import os ls = os.lin ...

  2. 以最简单的登录为例,诠释JS面向对象的简单实例

    JavaScript,是前端开发人员必须会的一门技术,从JS演变出来的有很多框架,先说说几个热门的框架吧: JQuery:这个技术必须会,如果不会,那一定要会查api,知道怎么写,要看得懂英文文档,这 ...

  3. NOIP1999邮票面值设计[搜索|DP]

    题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之间的每一个邮资值都能得到 ...

  4. POJ1849Two[DP|树的直径](扩展HDU4003待办)

    Two Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1390   Accepted: 701 Description Th ...

  5. VIJOS P1426兴奋剂检查[DP 状态哈希]

    背景 北京奥运会开幕了,这是中国人的骄傲和自豪,中国健儿在运动场上已经创造了一个又一个辉煌,super pig也不例外……………… 描述 虽然兴奋剂是奥运会及其他重要比赛的禁药,是禁止服用的.但是运动 ...

  6. UI的重用性

    UI抽取思路 一款手机游戏中UI有几十个到上百个不等,如果一个一个做这些UI,无疑会花费很多时间. 近期我们的游戏UI已经是第N次改版了,经过这N多次的修改,我总结了UI其实有很多的共性(就是相同性) ...

  7. gnuplot 的安装

    需要同时安装gnuplot和gnuplot-x11才能画出图 sudo apt-get install gnuplot gnuplot-x11 gnuplot not showing the grap ...

  8. PAT 1015. 德才论 (25) JAVA

    宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子 ...

  9. JS 中如何判断 undefined 和 null

    JS 中如何判断 undefined JavaScript 中有两个特殊数据类型:undefined 和 null,下节介绍了 null 的判断,下面谈谈 undefined 的判断. 以下是不正确的 ...

  10. CastleActiveRecord在多线程 事务提交时数据库资源竞争导致更新失败的测试结果记录

    CastleActiveRecord 经过测试,隔离级别: // 摘要: ,         ,         ,         ,         ,         ,         ,   ...