记录一下学习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. hadoop日常运维与升级总结

    日常运维 升级 问题处理方法 日常运维 进程管理 由于配置文件的更改,需要重启生效, 或者是进程自己因某种致命原因终止, 或者发现进程工作出现异常等情况下,需要进行手动进程的关闭或启动, 或者是增删节 ...

  2. Jetty使用攻略

    jetty作为一款小型的web容器用处很大,因为其小巧强大,经常作为嵌入式的组件处理http交互. Jetty 作为一个独立的 Servlet 引擎可以独立提供 Web 服务,但是它也可以与其他 We ...

  3. Java开发之@PostConstruct和@PreConstruct注解

    从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct.这两个注解被用来修饰一个非静态的 ...

  4. AngularJS XMLHttpRequest

    $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据. 读取 JSON 文件 下是存储在web服务器上的 JSON 文件: { "records": [ ...

  5. BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1800  Solved: 984[Submit][Statu ...

  6. java 27 - 10 反射之 动态代理的代码实现

    为什么要写动态代理类? 例子: 如果现在想做个登陆注册的功能.用户可以执行登陆.注册.添加.删除这些功能. 但是,有些功能是要有一定权限才可以执行的. 而现在已经有了个用户类的接口和该类的实现类了,但 ...

  7. 将pdf文件通过itunes直接拖到ipad的ibooks里面

    开始不太清楚进行过什么设置,使得以前可以直接通过拖动的方式复制pdf文件到ipad里面的方法不管用了.在帖子http://bbs.weiphone.com/read-htm-tid-864091-pa ...

  8. Oracle中把一个DateTime的字符串转化成date类型。to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'),

    Oracle中把一个DateTime或者该形态字符串转化成date类型. to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'), 或者: sele ...

  9. iOS Block 内存管理的探讨

    在很多情况下Block是造成程序循环引用内存泄漏的元凶.下面我们就讲解一下block对内存管理的影响.在讲解之前.希望大家对block有一定的了解.如果大家还不是太清楚block的实现原理.希望大家可 ...

  10. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合