hibernate总结一
在hibernate中查询使用List,Map和类对象定制返回类型
一般情况下,我们通过构建hql,并通过设置query的resultTransformer来定制返回结果的类型,一般设置为map属性,如下所示、来指定查询结果的每一项为一个map。:
Query query = session.createQuery("hql");
query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_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)
A、使用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,四川]]
采用list方法查询的返回结果为一个List,该List中封装的对象分为以下三种情况:
1.查询全部字段的情况下,如"from 实体类",list中封装的对象为实体类本身,各属性都将得到填充。
2.只查询一个字段,默认情况下,list中封装的是Object对象。
3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致。
String query = "select new Map(p.code, p.value) from Dictionary p";
//完全面向对象,使用java中的new Map
List list = session.createQuery(query).list();
//结果:[{1=四川, 0=001},{1=北京, 0=002},{1=四川, 0=001}
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}]
C、Others
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支持ClassTest(p.name, p.address)的构造函数:) select new Map(p.name as personName) from Person as p ;
//select将选中的表达式命名为别名,这种用法与new Map()结合,选择出来的是Map结构,
//以personName为key,将实际选择出来的值作为value
--------------------------------------------------------------------------------------------------
D、One More Thing
相信用过hibernate的兄弟们都会因为多表复杂查询后,为返回的结果如何组装到一个VO中而烦恼不已。我也不停的为此而烦恼,但是在看了hibernate的transform后,感觉这个方法还挺管用的。
假设我们现在有一个DTO,其属性包括两张表的属性,我们现在需要将sql语句(不是Hql语句哦:)查询得到的内容转为一个DTO对象,其解决方法如下:
//sql语句
String sql = "select u.userName as userName, p.title as title, p.addTime as addTime from user as u,post as p where u.id=p.userId"
//PostVO类,里边放着了用户的信息和帖子的信息的属性,设置get\set方法,务必保证这个类里边有一个默认的构造函数。
Query q = getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));
可以看下hibernate这一部分的源码就会发现,主要是使用了AliasToBeanResultTransformer这个类,通过sql的 查询,会返回数组,然后hibernate根据数据表的映射,自动帮我们来set对应的字段属性,所以标红的部分务必要跟VO中的属性值一致,要不然会报错的。 如果需要的话,大家也可以重写这个类。例如VOResultTransformer。然后在dao中更改成
setResultTransformer(new VOResultTransformer(PostVO.class));
ps:
参考博客:) 关于hibernate纯sql查询返回结果集问题(hbm.xml中不写多表关联)
参考文章:) hibernate-hql-createquery-list-type-cast-to-model-directly
//add
//使用了包名 com.example.DTO
List<DTO> dtos = session.createQuery("SELECT NEW com.example.DTO( p.name, o.name) FROM Entity o").list();
hibernate总结一的更多相关文章
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- 解决 Springboot Unable to build Hibernate SessionFactory @Column命名不起作用
问题: Springboot启动报错: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati ...
- hibernate多对一双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Hibernate中事务的隔离级别设置
Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下
- Hibernate中事务声明
Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...
- spring applicationContext.xml和hibernate.cfg.xml设置
applicationContext.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans ...
- [原创]关于Hibernate中的级联操作以及懒加载
Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...
- hibernate的基本xml文件配置
需要导入基本的包hibernate下的bin下的required和同bin下optional里的c3p0包下的所有jar文件,当然要导入mysql的驱动包了.下面需要注意的是hibernate的版本就 ...
- Maven搭建SpringMVC+Hibernate项目详解 【转】
前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...
- 1.Hibernate简介
1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发; b.大大减少代码量; c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
随机推荐
- 1203.2——条件语句 之 switch语句
用 if else 语句在处理多分支的时候,分支太多就会显得不方便,且容易出现 if 和 else配对出现错误的情况.例如,输入一个整数,输出该整数对应的星期几的英文表示: #include < ...
- 1.想写一些关于c++的东西了,就作为个开篇吧
又再一次重拾c++,想写一些东西,给自己看看,不想再看一些隐晦翻译的外国书籍了,就从一本好读的书开始写一写. 就这本吧, <我的第一本C++书>> 来写一写自己的东西.
- (转) int argc, char* argv[] 的用法
int main(int argc, char* argv[]) 這兩個參數的作用是什麼呢?argc 是指命令行輸入參數的個數,argv存儲了所有的命令行參數.假如你的程式是hello.exe,如果在 ...
- 自动运行native2ascii 命令的Bat文件的编写
使用eclipse开发,对于.properties文件的国际化,如果不使用插件对文件进行转码,则需要使用native2ascii命令自行对文件进行转码. 为了更方面的执行此操作,我将该 ...
- SqlServer排序(null值,和非空值排列顺序)
项目中遇到一个问题,需要设置序号排序,而该字段中的默认值为空,使用普通排序,空值就会在最前边.可以使用如下语句: 其中 col 为 排序的字段名称. then 0 else 1 代表先空值,后数字 ...
- https://github.com/aptana/studio3/releases aptana
https://github.com/aptana/studio3/releases aptana
- 《Python基础篇》之初识Python一
Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- bug的处理流程
又属于一篇普及文,希望自己在被各种技术吸引的同时,能时常来整理和总结软件测试最基本的知识. 从刚工作时接触的第一个缺陷管理工具禅道,到redmine.JIRA.bugzilla ,再到现在的QC,当然 ...
- js区分移动设备与PC
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Linux系统编程(13)——Shell的基本语法
按照惯例,Shell变量由全大写字母加下划线组成,有两种类型的Shell变量:环境变量和本地变量. 环境变量: 环境变量可以从父进程传给子进程,因此Shell进程的环境变量可以从当前Shell进程传给 ...