以前用.NET lambda表达式 将SQL查询的结果转换成其他自定义对象集合只需要
select( p => new incident_listVM() {
UserName = o.name,
UserAge = o.age
}).ToList();
现在用Hibernate,使用JPA作为CriteriaQuery去动态查询或者就用原始SQL去查询,
不想最后取到的数据是一个单表的实体对象,然后自己再写循环去赋值给自己的自定义对象
有没有类似.NET上面的方法,再Select或者GetResultList的时候就进行转换,由HB转换得到
我要的对象集合?望指点,谢谢
是我自己对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会自己自动映射转换
是我多虑了~~~
java 8 不是有 lamda 么,也有 map 方法.
忘记说了 我用的是JDK1.7 Hibernate 5.1 因为HB5.2不支持JDK1.7
@犇牛牛: 用5.2不就可以正大光明使用java 8 了么
@长蘑菇星人: 呵呵 知道 如果是那个估计也不用问了 但是现在就是想知道用HB5.1 怎么能够实现呢?
总不会只有最新版才能解决目前的问题把,有什么解决方案不?
@犇牛牛: 这个不算问题吧,只不过你不想写for而已.
@长蘑菇星人: 我主要担心会有效率问题 比如从数据库查询出数据集,.NET只遍历一遍就返回了我要的对象
而我担心Java HB先List 一个数据集(遍历过一次),然后又遍历一次去生成对象,如果重复2次就存在效率低下的问题了
@犇牛牛: 你是有多少数据啊,需要考虑循环的性能.
你能确定.Net只遍历一次?
@长蘑菇星人: 从我的“感觉上”应该只遍历一次,就是从数据库查询SQL后数据集通过datareader进行逐行读取 然后转换对象 那么只遍历一次 而List肯定是对数据集遍历过一次的结果 再遍历转换就是第二次 这肯定效率上差别很大了 不管你数据量多少 都存在的一个效率问题
@犇牛牛: Hibernate 不可以直接转换成对象么,这么考虑性能为什么要用orm框架呢[滑稽]
你先把功能实现了再说,性能有没有问题,还是得之后再观察才知道。
别乱猜。
上面也说了用for去循环实现功能 我既然问这个问题肯定就不仅仅实现就完了
就像教程 写的都是简单的单表的条件查询 这个没有意义啊 实际项目都是动态查询
动态查询你用拼SQL是可以实现 可是这种写法了解一下就可以 实际运用不规范 肯定是用JPA去实现啊
所以我才问上面那个问题 毕竟我是HB和JAVA的新手 很多东西都是先按.NET的方式去思考有没有对应的方案
事实上HB的CriteriaQuery和.NET的IQueryAble接口是类似的 所以我就想select这块是否也有对应的
@犇牛牛:
是不是可以这么理解你的需求:把List<T1>转成List<T2>?
@西漠以西: 示例好像都是直接转换的表实体对象,比如有个表是User 那么查询select e from User e
返回的是List<User> 现在我有一个自定义的对象MyUser 我想返回的是List<MyUser>
而MyUser可以根据User转换而来
@犇牛牛: 喔,那我猜对了。
你需要的是一个类似于.net中AutoMapper组件的东西(对象与对象之间映射),java里肯定有的。比如:
ModelMapper
@西漠以西: 哈 我希望的还是HB能够解决这个问题 而不是再套一个ModelMapper 我还是自己想想办法吧