文档章节

Hibernate学习5--Hql查询

zimingforever
 zimingforever
发布于 2014/04/21 15:49
字数 768
阅读 139
收藏 2

Hql是Hibernate中较为强大的部分,其可以将java的实体对象和Sql相互关联起来,开发过程不必要传入具体的sql,只要专注于类对象的相关逻辑即可。

这里我们测试代码采用了注解的形式,这里要先配置一下注解的扫描位置,

 <property name="annotatedClasses">
            <list>
                <value>com.xiaoming.test.hibernate.studentTest.Student</value>
            </list>
        </property>

或者采用如下packeage格式的配置

 <property name="packagesToScan">
            <list>
                <value>com.xiaoming.test.hibernate.studentTest.*</value>
            </list>
        </property>

对应的注解方式写法如下:

@SuppressWarnings("serial")
@Entity
@Table(name="student1")
public class Student implements Serializable {
    @Id
    @Column(name="id")
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id;
    @Column(name="name")
    private String name;
}

Hibernate中有两种query方法,一种是createQuery,另一种是createSQLQuery。这两种方法的区别是前者可以使用hql语句查询,后者用sql语句查询,前者返回的是Hibernate生成的Bean对象,后者返回的是对象数组,但是也可以使用addEntity(xxx.class)映射成对应的bean返回。

我们先看看createSQLQuery的使用方法:

 public void testHql() {
        //list方法返回object的属性
        String hql="select * from student1 where id =1";
        Query query=session.createSQLQuery(hql);
        List result=query.list();
        for(int i=0;i<result.size();i++){
            Object[] objects = (Object[])result.get(i);
            for(int j=0;j<objects.length;j++){
                System.out.println(objects[j].getClass().getName());
            }
        }
        
        //list方法设置返回类型为Map
        String hq2="select * from student1 where id =1";
        Query query2=session.createSQLQuery(hql2);
        query2.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        List result2=query2.list();
        for(int i=0;i<result2.size();i++){
            Map map = (Map) result2.get(i);
            System.out.println(map.get("id"));
        }
        
        //使用函数
        String hql3="select count(id) NUM from student1";
        Query query3=session.createSQLQuery(hql3).addScalar("NUM");
        query3.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        List result3=query3.list();
        for(int i=0;i<result3.size();i++){
            Map map = (Map) result3.get(i);
            System.out.println(map.get("NUM"));
        }
    }

这里有个点要注意一下,除了list方法外,iterator也可以获取到对应的数据,他们的区别是list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据。iterator在默认情况下利用缓存数据,但如果缓存中不存在数据有可能出现N+1问题。

下面是createQuery的使用方法,其中Student大写表示对应的java对象。

 //采用:的方法标识传入参数
 String hql = "from Student o where id = :id";
        Query query = session.createQuery(hql);
        query.setParameter("id", 1);
        List result=query.list();
        for (Iterator iter=result.iterator(); iter.hasNext();) {
            Student student = (Student)iter.next();
            System.out.println(student.getName());
        }
        
        //采用?的方式标识参数
        String hql2 = "from Student o where id = ?";
        Query query2 = session.createQuery(hql2);
        query2.setParameter(0,1);
        List result2=query2.list();
        for (Iterator iter=result2.iterator(); iter.hasNext();) {
            Student student = (Student)iter.next();
            System.out.println(student.getName());
        }

        //可以使用setParameterList方法传入一系列参数
        String hql3 = "from Student o where id in (:ids)";
        Query query3 = session.createQuery(hql3);
        query3.setParameterList("ids",new Object[]{1,3});
        List result3=query3.list();
        for (Iterator iter=result3.iterator(); iter.hasNext();) {
            Student student = (Student)iter.next();
            System.out.println(student.getName());
        }

        //可以直接返回单一对象
        String hql4 = "select count(*) from Student";
        Query query4 = session.createQuery(hql4);
        Long result4= (Long) query4.uniqueResult();
        System.out.println(result4);

自此,Hql的内容和功能基本上学习的差不多了,从最开始的环境配置,相关概念,关联关系到今天的Hql使用,Hibernate基本上已经入门了。以后需要多多在项目中练习,有时间也可以看看相关的代码实现,特别是java对象和相关sql的转换那块。


© 著作权归作者所有

zimingforever
粉丝 142
博文 266
码字总数 315040
作品 0
杭州
程序员
私信 提问
Hibernate查询语言(HQL)

Hibernate查询语言(HQL)与SQL(结构化查询语言)相同,但不依赖于数据库表。 我们在HQL中使用类名,而不是表名,它是数据库独立的查询语言。HQL有很多优点: 数据库独立 支持多态查询 易于Java程...

爆米花9958
2017/09/08
0
0
Hibernater学习笔记(三)

1.Hibernate缓存 Hibernate一级缓存 hibernate 的一级缓存默认是打开的 hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围 hibernate的一级缓存中,储存数据必须...

Mr_欢先生
2017/12/08
0
0
(J2EE学习笔记)六种方式实现hibernate查询

对Hibernate的底层调用数据库查询并不是很了解,引用了这位前辈的一篇博文。 注明文章出处:http://www.cnblogs.com/shiyangxt/archive/2009/01/13/1375151.html 实现hibernate查询的六种方式...

w1sw
2016/04/15
0
0
HQL语句讲解

本章介绍了Hibernate的几种主要检索方式:HQL检索方式、QBC检索方式、SQL检索方式。HQL是Hibernate Query Language的缩写,是官方推荐的查询语言。QBC是Query By Criteria的缩写,是Hiberna...

孤独成性
2016/11/16
36
0
学习笔记 Hibernate HQL进阶

Hibernate HQL进阶 HQL查询优化 在使用HQL 时 避免使用 OR not like having distinct 等关键词 数据加载方式 立即加载 特点: Lazy ='true' 优点: 对应用程序透明,不管对象处于什么状态 例...

空_明
2012/08/08
380
1

没有更多内容

加载失败,请刷新页面

加载更多

Docker常用命令小记

除了基本的<font color="blue">docker pull</font>、<font color="blue">docker image</font>、<font color="blue">docker ps</font>,还有一些命令及参数也很重要,在此记录下来避免遗忘。 ......

程序员欣宸
昨天
3
0
MAT使用-jvm内存溢出问题分析定位

1.MAT简介: MAT 全称 Eclipse Memory Analysis Tools 是一个分析 Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,看看是谁阻止了垃圾收集器的回收工作,...

xiaomin0322
昨天
4
0
内网和外网之间的通信(端口映射原理)

首先解释一下“内网”与“外网”的概念: 内网:即所说的局域网,比如学校的局域网,局域网内每台计算机的IP地址在本局域网内具有互异性,是不可重复的。但两个局域网内的内网IP可以有相同的...

Jack088
昨天
5
0
3.深入jvm内核-原理、诊断与优化-4. GC算法和种类

一、GC算法和种类 GC的概念 GC算法 引用计数法 标记清除 标记压缩 复制算法 可触及性 Stop-The-World GC的对象是堆空间和永久区 引用计数法 老牌垃圾回收算法 通过引用计算来回收垃圾 使用者...

hexiaoming123
昨天
4
0
MySQL中的哈希索引

Memory中的哈希索引 哈希索引是基于哈希表实现的,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希码是一个较小的值,并且不同键值的...

我的眼里只有眼屎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部