在hibernate中查询使用List,Map和类对象定制返回类型
在hibernate中查询使用List,Map和类对象定制返回类型
王春-海子 发表于2年前
在hibernate中查询使用List,Map和类对象定制返回类型
  • 发表于 2年前
  • 阅读 11
  • 收藏 0
  • 点赞 1
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 一般通过设置query的resultTransformer来定制返回结果的类型,一般设置为map属性query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);新版hibernate可以在hql中直接使用集合查询语句,如list和map了,如:select new Map(p.code, p.value)和select new Map(p.code as code, p.value as value)

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

Query query = session.createQuery("hql");?

query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);

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

mysql> select * from p_dictionary;

+-----------------+----+---------+------+--------+--------+

| dictionary_type | id | version | code | forbid | value |

+-----------------+----+---------+------+--------+--------+

| COUNTY | 1 | 0 | 001 | | 四川 |

| COUNTY | 2 | 0 | 002 | | 北京 |

| COUNTY | 3 | 0 | 001 | NULL | 四川 |

+-----------------+----+---------+------+--------+--------+

3 rows in set (0.00 sec)

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

使用List

String query = "select new List(p.code, p.value) from Dictionary p";

List list = session.createQuery(query).list();

System.out.println(list);

//结果: [[001, 四川],[002,北京],[001,四川]]

?

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

String query = "select new Map(p.code, p.value) from Dictionary p";

List list = session.createQuery(query).list();

//结果:[{1=四川, 0=001},{1=北京, 0=002},{1=四川, 0=001}]

?

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

String query = "select new Map(p.code as code, p.value as value) from Dictionary p";

List list = session.createQuery(query).list();

//结果:[{value=四川, code=001},{value=北京, code=002},{value=四川, code=001}]

?

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

String query = "select new Map(p.code as code, p.value) from Dictionary p";

List list = session.createQuery(query).list();

//结果:[{1=四川, code=001},{1=北京, code=002},{1=四川, code=001}]

--------------------------------------------------------------------------------------------------

select new List(p.name, p.address) from Person as p ;
select将选择出来的属性存入一个List对象中

select new ClassTest(p.name, p.address) from Person as p;
select将选择出来的属性封装成对象,前提是ClassTest支持p.name, p.address的构造函数,

select new Map(p.name as personName) from Person as p ;
select将选中的表达式命名为别名,这种用法与new Map()结合,选择出来的是Map结构,
以personName为key,将实际选择出来的值作为value


  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 5
博文 49
码字总数 11981
×
王春-海子
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: