首页新闻找找看学习计划

关于Java用hibernate利用JPA如何查询出一个自定义对象List<T>?

0
悬赏园豆:10 [已解决问题] 解决于 2017-12-01 11:16

以前用.NET lambda表达式 将SQL查询的结果转换成其他自定义对象集合只需要

select( p => new incident_listVM() {

  UserName = o.name,

  UserAge = o.age

}).ToList();

 

现在用Hibernate,使用JPA作为CriteriaQuery去动态查询或者就用原始SQL去查询,

不想最后取到的数据是一个单表的实体对象,然后自己再写循环去赋值给自己的自定义对象

有没有类似.NET上面的方法,再Select或者GetResultList的时候就进行转换,由HB转换得到

我要的对象集合?望指点,谢谢

犇牛牛的主页 犇牛牛 | 初学一级 | 园豆:31
提问于:2017-11-30 09:19
< >
分享
最佳答案
0

是我自己对HB 不熟 至少5.1里面 调用的是list()方法 然后很神奇的是 HB会自动转换为你定义对象的结果集

比如我定义了一个 List<MyClass> result= null;

sql = "select a.aa,a.bb from table a" //模拟SQL

Query query = session.createSQLQuery(sql);

result = query.list(); //HB会自己自动映射转换 

是我多虑了~~~ 

犇牛牛 | 初学一级 |园豆:31 | 2017-12-01 10:29
其他回答(2)
0

java 8 不是有 lamda 么,也有 map 方法.

收获园豆:5
长蘑菇星人 | 园豆:1820 (小虾三级) | 2017-11-30 09:33

忘记说了 我用的是JDK1.7 Hibernate 5.1  因为HB5.2不支持JDK1.7

支持(0) 反对(0) 犇牛牛 | 园豆:31 (初学一级) | 2017-11-30 10:06

@犇牛牛: 用5.2不就可以正大光明使用java 8 了么

支持(0) 反对(0) 长蘑菇星人 | 园豆:1820 (小虾三级) | 2017-11-30 10:11

@长蘑菇星人: 呵呵 知道 如果是那个估计也不用问了 但是现在就是想知道用HB5.1 怎么能够实现呢?

总不会只有最新版才能解决目前的问题把,有什么解决方案不?

支持(0) 反对(0) 犇牛牛 | 园豆:31 (初学一级) | 2017-11-30 10:20

@犇牛牛: 这个不算问题吧,只不过你不想写for而已.

支持(0) 反对(0) 长蘑菇星人 | 园豆:1820 (小虾三级) | 2017-11-30 10:21

@长蘑菇星人: 我主要担心会有效率问题 比如从数据库查询出数据集,.NET只遍历一遍就返回了我要的对象

而我担心Java HB先List 一个数据集(遍历过一次),然后又遍历一次去生成对象,如果重复2次就存在效率低下的问题了

支持(0) 反对(0) 犇牛牛 | 园豆:31 (初学一级) | 2017-11-30 10:32

@犇牛牛: 你是有多少数据啊,需要考虑循环的性能.
你能确定.Net只遍历一次?

支持(0) 反对(0) 长蘑菇星人 | 园豆:1820 (小虾三级) | 2017-11-30 10:36

@长蘑菇星人: 从我的“感觉上”应该只遍历一次,就是从数据库查询SQL后数据集通过datareader进行逐行读取 然后转换对象 那么只遍历一次  而List肯定是对数据集遍历过一次的结果 再遍历转换就是第二次 这肯定效率上差别很大了  不管你数据量多少 都存在的一个效率问题

支持(0) 反对(0) 犇牛牛 | 园豆:31 (初学一级) | 2017-11-30 10:44

@犇牛牛: Hibernate 不可以直接转换成对象么,这么考虑性能为什么要用orm框架呢[滑稽]

支持(0) 反对(0) 长蘑菇星人 | 园豆:1820 (小虾三级) | 2017-11-30 10:54
0

你先把功能实现了再说,性能有没有问题,还是得之后再观察才知道。

别乱猜。

收获园豆:5
西漠以西 | 园豆:1670 (小虾三级) | 2017-11-30 11:09

上面也说了用for去循环实现功能 我既然问这个问题肯定就不仅仅实现就完了 

就像教程 写的都是简单的单表的条件查询 这个没有意义啊 实际项目都是动态查询

动态查询你用拼SQL是可以实现 可是这种写法了解一下就可以 实际运用不规范 肯定是用JPA去实现啊

所以我才问上面那个问题 毕竟我是HB和JAVA的新手 很多东西都是先按.NET的方式去思考有没有对应的方案

事实上HB的CriteriaQuery和.NET的IQueryAble接口是类似的 所以我就想select这块是否也有对应的

支持(0) 反对(0) 犇牛牛 | 园豆:31 (初学一级) | 2017-11-30 11:30

@犇牛牛: 

是不是可以这么理解你的需求:把List<T1>转成List<T2>?

支持(0) 反对(0) 西漠以西 | 园豆:1670 (小虾三级) | 2017-11-30 11:34

@西漠以西: 示例好像都是直接转换的表实体对象,比如有个表是User 那么查询select e from User e

返回的是List<User>  现在我有一个自定义的对象MyUser 我想返回的是List<MyUser>

而MyUser可以根据User转换而来

支持(0) 反对(0) 犇牛牛 | 园豆:31 (初学一级) | 2017-11-30 11:46

@犇牛牛: 喔,那我猜对了。

你需要的是一个类似于.net中AutoMapper组件的东西(对象与对象之间映射),java里肯定有的。比如:

ModelMapper

支持(0) 反对(0) 西漠以西 | 园豆:1670 (小虾三级) | 2017-11-30 12:00

@西漠以西: 哈 我希望的还是HB能够解决这个问题 而不是再套一个ModelMapper  我还是自己想想办法吧

支持(0) 反对(0) 犇牛牛 | 园豆:31 (初学一级) | 2017-11-30 14:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册