码迷,mamicode.com
首页 > 数据库 > 详细

Hibernated的sql查询

时间:2016-07-30 17:59:17      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

记录一下学习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查询

标签:

原文地址:http://www.cnblogs.com/liuconglin/p/5721199.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!