Hibernate SQLQuery原生sql查询

hibernate的查询方式有HQL,Cretiria和SQL.
hql查询面向对象的语句风格确实要简洁一些(只是那么一点),
cretiria本人目前没在项目中使用过.
有一半的时候, 我在Hibernate框架中使用的是SQL查询,
简单,可控, 原生. 使用起来风格原始,简单有效, 不增加学习成本,且利于多人开发的维护.
Hibernate提供一个接口SQLQuery, 用于支持原生sql语句查询.

package com.hbt3.app;

import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.transform.Transformers;

import com.hbt3.entity.User;
import com.hbt3.entity.UserDto;
import com.hbt3.utils.HibernateUtil;

/**
 * @description hibernate SQLQuery原生sql查询
 * @author huangjc
 * @date 2016年12月17日 20:46:07
 */
public class HibernateSQLQuery {

    public static void main(String[] args) {

        query1(); //SQLQuery查询返回List
        query2(); //SQLQuery.addEntity(User.class)查询返回List
        query3(); //SQLQuery.addScalar("userId");sqlQuery.setResultTransformer(Transformers.aliasToBean(UserDto.class));查询返回List
        //query4(); //sqlQuery.setResultSetMapping(arg0) 查询返回关联结果集
    }

    // 查询返回List
    public static void query1() {
        Session session = HibernateUtil.getSession();// 获取session会话对象
        session.beginTransaction();// 开始一个事务
        String sql = "select * from t_user t where t.name = ?";
        SQLQuery sqlQuery = session.createSQLQuery(sql);// SQLQuery是hibernate用于支持原生sql的接口类
        sqlQuery.setParameter(0, "黑蜗牛");

         /////////////////这里查出来的是LIST, list里面装的是Object类型的数组
         List userList = sqlQuery.list();
         System.out.println("查询到" + userList.size() + "条结果.");
         for(Object obj: userList) {//需要for循环遍历取数据
         Object[] objArray = (Object[]) obj;
         System.out.println("----id:"+ objArray[0] + "----userId:" + objArray[1] 
                 + "----name:" + objArray[2] + "----password:" + objArray[3] + "----preference:" + objArray[4]);
         }
        session.getTransaction().commit();
    }

    //查询返回List
    public static void query2(){

        Session session = HibernateUtil.getSession();// 获取session会话对象
        session.beginTransaction();// 开始一个事务
        String sql = "select * from t_user t where t.name = ?";
        SQLQuery sqlQuery = session.createSQLQuery(sql);// SQLQuery是hibernate用于支持原生sql的接口类
        sqlQuery.setParameter(0, "黑蜗牛");
        // /////////////////这里查出来的是t_user对应的User对象,字段一一对应,数量和类型必须都一致
        sqlQuery.addEntity(User.class);
        List userList = (List)sqlQuery.list();
        System.out.println("查询到" + userList.size() + "条结果.");
        for (User user : userList) {// 需要for循环遍历取数据
            System.out.println("----id:" + user.getId() + "----userId:" + user.getId() + "----name:" + user.getName()
                    + "----password:" + user.getPassword() + "----preference:" + user.getPreference());
        }
        session.getTransaction().commit();
    }

    //查询返回List
    public static void query3(){

        Session session = HibernateUtil.getSession();// 获取session会话对象
        session.beginTransaction();// 开始一个事务
        String sql = "select t.user_id userId, t.name from t_user t where t.name = ?";
        SQLQuery sqlQuery = session.createSQLQuery(sql);// SQLQuery是hibernate用于支持原生sql的接口类
        sqlQuery.setParameter(0, "黑蜗牛");
        sqlQuery.addScalar("userId");//*************************特别注意:addScalar一旦使用, 那么就会严格按照addScalar的列来返回, 其他列是不存在不返回的,null都没有!!
        sqlQuery.addScalar("name");
        // /////////////////这里查出来的是不受hibernate管理的自定义DTO对象
        sqlQuery.setResultTransformer(Transformers.aliasToBean(UserDto.class));
        List userList = (List)sqlQuery.list();
        System.out.println("查询到" + userList.size() + "条结果.");
        for (UserDto userDto : userList) {// 需要for循环遍历取数据
            System.out.println("----userId:" + userDto.getUserId() + "----name:" + userDto.getName());
        }
        session.getTransaction().commit();
    }

    //占个位,有空再来写sqlQuery.setResultSetMapping(arg0)
    //sqlQuery.setResultSetMapping(arg0)是结合配置文件一起工作的, 适用于返回复杂的结果集
    public static void query4(){


    }
}

控制台打印:

Hibernate: select * from t_user t where t.name = ?
查询到1条结果.
----id:FDF619898A604005B647B5B4D70CEE4A----userId:002----name:黑蜗牛----password:hwn----preference:蜗牛
Hibernate: select * from t_user t where t.name = ?
查询到1条结果.
----id:FDF619898A604005B647B5B4D70CEE4A----userId:FDF619898A604005B647B5B4D70CEE4A----name:黑蜗牛----password:hwn----preference:蜗牛
Hibernate: select t.user_id userId, t.name from t_user t where t.name = ?
查询到1条结果.
----userId:002----name:黑蜗牛
                        ***-- 正道崎岖, 风雨兼程.***

你可能感兴趣的:(hibernate,sql)