转: 在hibernate中查询使用list,map定制返回类型

在使用hibernate进行查询时,使用得最多的还是通过构建hql进行查询了。在查询的过程当中,除使用经常的查询对象方法之外,还会遇到查询一个属性,或一组聚集结果的情况。在这种情况下,我们通常就需要对返回的结构进行处理。
    一般情况下,我们通过构建hql,并通过设置query的resultTransformer来定制返回结果的类型,一般设置为map属性,如下所示:

1 Query query = session.createQuery("hql");
2 query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);

来指定查询结果的每一项为一个map。
    不过,随着hibernate的发展,可以在hql中直接使用集合查询语句,如list和map了。以下分别介绍使用list和map时的查询语句以及查询结果。首先,数据库的数据如下所示:

1 mysql> select * from p_dictionary;
2 +-----------------+----+---------+------+--------+--------+
3 | dictionary_type | id | version | code | forbid | value  |
4 +-----------------+----+---------+------+--------+--------+
5 | COUNTY          |  1 |       0 | 001  |        | 四川   |
6 | COUNTY          |  2 |       0 | 002  |        | 北京   |
7 | COUNTY          |  3 |       0 | 001  | NULL   | 四川   |
8 +-----------------+----+---------+------+--------+--------+
9 3 rows in set (0.00 sec)

以下分别介绍使用list和map的查询语句和查询结果:

使用list

1 String query = "select new list(p.code,p.value) from Dictionary p";
2 List list = session.createQuery(query).list();
3 System.out.println(list);
4 //结果
5 [[001, 四川], [002, 北京], [001, 四川]]

使用map,首先不指定alias,则结果的键就按照查询出来的顺序结果,使用0,1来表示key:

1 String query = "select new map(p.code,p.value) from Dictionary p";
2 List list = session.createQuery(query).list();
3 //结果
4 [{1=四川, 0=001}, {1=北京, 0=002}, {1=四川, 0=001}]

使用map,指定alias,则结果中的key则为alias:

1 String query = "select new map(p.code as code,p.value as value) from Dictionary p";
2 List list = session.createQuery(query).list();
3 //结果
4 [{value=四川, code=001}, {value=北京, code=002}, {value=四川, code=001}]

如果部分使用alias,部分不使用,则使用了alias的将使用alias作为key,没有使用的则仍然使用序号代替,其中序号则为在查询结果的序号

1 String query = "select new map(p.code as code,p.value) from Dictionary p";
2 List list = session.createQuery(query).list();
3 //结果
4 [{1=四川, code=001}, {1=北京, code=002}, {1=四川, code=001}]

本文地址:http://www.iflym.com/index.php/code/use-list-set-map-in-hibernate-query.html

时间: 2024-09-29 10:46:01

转: 在hibernate中查询使用list,map定制返回类型的相关文章

hibernate sql查询对象到map中

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/26059615 插入排序:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 一.插入排序算法 /*************************************************************** *版权所有 (C)2014,公司名称. * *文件名称:插入排序法 *内容摘要:无 *其它说明:无 *当前版

hibernate(七) hibernate中查询方式详解

序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数据表查询操作详解  ,以至于看这篇文章不用那么吃力. --WH 一.hibernate中的5种检索方式 1.1.导航对象图检索方式 根据已经加载的对象导航到其他对象 例如:在前面的各种映射关系中,实体类包含对其他类对象的引用. Dept d = (Dept) session.get(Dept.cla

Hibernate学习(七)———— hibernate中查询方式详解

序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等 --WH 一.hibernate中的5种检索方式 1.1.导航对象图检索方式 根据已经加载的对象导航到其他对象 例如:在前面的各种映射关系中,实体类包含对其他类对象的引用. Dept d = (Dept) session.get(Dept.class,2); d.getStaffSet().size(); //d对象关联Staff集合,h

Hibernate中查询数据转成VO对象及注意问题

大家都可能会遇到,在用json传输数据时,很多字段是来自不同的表数据,需要我们进行封装数据. hibernate提供这么一个方法用来直接封装查询属性: query.setResultTransformer(Transformers.aliasToBean(VO.class)); Example: session.createQuery("select u.name as name , u.age as age from User as u").setResultTransformer(

C#中,当从数据库中查询到数据,以DataTable类型返回后,如果需要对DataTable中的数据进行筛选,可以选择下面的方式

DataRow[] dr = _deptCodeDt.Select(string.Format(" ward_code = '{0}'", LocalSetting.WardCode)); if (dr.Length <= 0) return; DataTable tempT = new DataTable(); tempT = dr[0].Table.Clone(); //克隆表结构 DataSet tempDs = new DataSet(); tempDs.Tables.A

Hibernate中使用子查询

子查询: 子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供了支持. 如下面代码所示: List list=session.createQuery("from Customer c where 1>(select count(o) from c.orders o)").list(); 上面的程序查询订单数超过1的所有客户,因此和上面子查询HQL语句对应的SQL语句为: Select *

Hibernate 分页 查询

昨天的作业  分页: 主要的代码块:(明天实现分页的封装) 1 package com.cy.beans; 2 3 import java.util.List; 4 5 /** 6 * 定义一个分页对象 7 * @author acer 8 * 9 */ 10 public class Pager { 11 12 private int page;//当前页码 13 private int pageTotal;//总页码 14 private int rowsTotal;//总条数 15 pri

hibernate中get和load的理解

hibernate中查询时,有get和load两种方法,但两者有一些不同,说说我的理解. get是直接从数据库中查询,而load是缓存. 比如,getBean表示get方法查到的对象,loadBean表示load方法查到的对象. 在getBean中,该对象中所有的属性,已经全部封装完毕了: 但是loadBean中,只封装了该对象的id,其他的值还没有封装,要等到我们去调用这些值的是,才会去数据库中查出来封装进去. 所以,getBean中的属性,我们可以随时调用: 但是loadBean中的属性,我

Hibernate createSQLQuery 查询char类型结果为一个字符解决方法汇总

在使用Hibernate的原生态SQL对Oracle进行查询时,碰到查询char类型的时候始终返回的是一个字符,开始认为应该是Hibernate在做映射的把数据类型给映射成char(1),在经过查找网上的一些资料,得知产生这个问题的主要原因确实是Hibernate再查询Oracle的时候,将char自动映射成character(varchar的子集)类型,oracle的char字段在hibernate里映射为character类型,是varchar的子集. 现有以下几种解决方法: 1:将你要查询