15、Hibernate的原生sql查询,优化Hibernate的查询效率

public class TestSQL {

    @Test
    public void test01() {
        Session session = null;
        try {
            session = HibernateUtil.openSession();
            List<Student> stus = session.createSQLQuery("select * from t_stu where name like ?")
                    .addEntity(Student.class)
                    .setParameter(0, "%孔%")
                    .setFirstResult(0).setMaxResults(10)
                    .list();
            for(Student stu:stus) {
                System.out.println(stu.getName());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            HibernateUtil.close(session);
        }
    }

    @Test
    public void test02() {
        Session session = null;
        try {
            session = HibernateUtil.openSession();
            List<Object[]> stus = session.createSQLQuery("select {stu.*},{cla.*},{spe.*} from " +
                    "t_stu stu left join t_classroom cla on(stu.cid=cla.id) " +
                    "left join t_special spe on(spe.id=cla.spe_id) where stu.name like ?")
                    .addEntity("stu",Student.class)
                    .addEntity("cla",Classroom.class)
                    .addEntity("spe",Special.class)
                    .setParameter(0, "%孔%")
                    .setFirstResult(0).setMaxResults(10)
                    .list();
            Student stu = null;
            Classroom cla = null;
            Special spe = null;
            List<StuDto> list = new ArrayList<StuDto>();
            for(Object[] obj:stus) {
                stu = (Student)obj[0];
                cla = (Classroom)obj[1];
                spe = (Special)obj[2];
                list.add(new StuDto(stu, cla, spe));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            HibernateUtil.close(session);
        }
    }

    @Test
    public void test03() {
        Session session = null;
        try {
            session = HibernateUtil.openSession();
            List<StudentDto> stus = session.createSQLQuery("select stu.id as sid,stu.name as sname," +
                    "stu.sex as sex,cla.name as cname,spe.name as spename from " +
                    "t_stu stu left join t_classroom cla on(stu.cid=cla.id) " +
                    "left join t_special spe on(spe.id=cla.spe_id) where stu.name like ?")
                    .setResultTransformer(Transformers.aliasToBean(StudentDto.class))
                    .setParameter(0, "%孔%")
                    .setFirstResult(0).setMaxResults(10)
                    .list();
            for(StudentDto sd:stus) {
                System.out.println(sd);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            HibernateUtil.close(session);
        }
    }

}
时间: 2024-10-11 12:47:13

15、Hibernate的原生sql查询,优化Hibernate的查询效率的相关文章

hibernate使用原生SQL查询返回结果集的处理

今天没事的时候,看到公司框架里有一个用原生SQL写的函数,说实在以前自己也干过这事,但好久都没有用,都忘得差不多了,现在基本都是用的hql语句来查询结果.hibernate中使用createSQLQuery拉来来实现SQL语句的查询,具体用法:session.createSQLQuery(sql),对于用SQL返回的结果集是一个什么样的结果集都毫无记忆.自己查了下,才知道,原来是返回一个Object类型数组的list集合,而其中Object类型的数组里的值则与sql语句中的查询项相对应,如果是s

Hibernate 使用原生SQL查询无法使用别名问题

最近遇到一个问题就是Hibernate在使用原生SQL进行多表联合查询别名的问题,一直报错,说是找不到某列,经过向别人咨询最后得出了解决方案 需要向数据库连接字符串中加入属性,具体如下 common.db.driverClassName=com.mysql.jdbc.Driver common.db.url=jdbc:mysql://10.10.11.8:3306/cm_mini_1?useOldAliasMetadataBehavior=true common.db.username=user

Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1

第一篇:官方文档的处理方法,摘自官方 在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持. 1.使用SQLQuery hibernate对原生SQL查询执行的控制是通过SQLQuery接口进行的. Session.createSQLQuery(); 1.1标量查询 最基本的SQL查询就是获得一个标量(数值)的列表. sess.createSQLQuery("SELECT * FROM CATS").list(); sess.createSQL

hibernate中使用sql语句进行表链接查询,对结果集的遍历方法

今天做了一个在hibernate中使用sql语句进行表链接查询的功能,得到的属性是来自两个表中的字段.下面对结果集遍历的方法进行记录. sql语句不写了.部分代码如下: List<Course_Material> list = new ArrayList<Course_Material>(); @SuppressWarnings("rawtypes") List accountList = query.list(); if(accountList.size()&

Hibernate 的原生 SQL 查询

Hibernate除了支持HQL查询外,还支持原生SQL查询.         对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.该接口是Query接口的子接口.         执行SQL查询步骤如下:         1.获取Hibernate Session对象         2.编写SQL语句         3.通过Session的createSQLQuery方法创建查询对象         4.调用SQ

Hibernate使用原生SQL语句进行无关联多表查询

背景:有两个表:CpCg与CpGg需要进行多表查询 因为CpGg表设计到与另外的表也有联系,因此师兄没有关联此两个表,只是用字段进行逻辑关联,CpGg表的cp字段与CpCg表的id字段逻辑关联 首先确保hibernate配置文件配置完成,配置文件如下:(一些与本人项目相关的关键字段已隐去) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC

Hibernate对原生sql处理及结果集和VO的映射

昨天解决一个看似很简单的需求, 我有一个类似下面的table(info_table),是收集产品使用的机型信息: id type model 1 nokia xxx1 2 nokia xxx2 3 Motorola yyyy1 4 Motorola yyyy2 5 Motorola yyyy3 要实现一个前台展示的页面: type countType nokia 2 Motorola 3 就这么简单的功能.相信稍微熟悉sql的人,马上就可以写出此实现.很惭愧的说,我的心里感觉很简单,由于很久没怎

Hibernate SQLQuery原生SQL查询

使用Hibernate SQLQuery进行查询时,如果有两个列的列明相同,那么在取值时,Hibernate会取第一个同名列的值(在SQLPlus中会自动在列明后面跟上写字符进行区分).如: 1.SQL语句 SELECT * FROM (SELECT 'A' A, 'B' B FROM DUAL) TEMP_A, (SELECT 'C' A, 'D' B FROM DUAL) TEMP_B 2.Sqlplus查询结果: 3.Hibernate SQLQuery查询结果:

Hibernate SQLQuery 原生SQL 查询及返回结果集处理-2

1. 返回List, .setResultTransformer(      Transformers.ALIAS_TO_ENTITY_MAP);将结果转为Map,存放到list中,即list中为若干map对象: 获取可按此方法: for (int i = 0; i < list.size(); i++) {             Map map = (Map) list.get(i);             System.out.println(map.get("table_colu