【分享】hibernate执行原生,指定返回实体类型

浮云若水 2014-06-25 04:32:51
hql相信大家都用的多,但有些时候有hql是不能代替原生SQL的,在开发过程中避免不了要应用到SQLquery执行原生sql,
但用SQLQuery执行原生sql的返回结果集,我们不好控制字段,返回结果集是object[]数组类型,取数时不是那么方便,如果返回的是list<object>,这时候取数就方便多了,直接循环取数就好,不需要字段类型转换之类的操作,其实很简单
			 StringBuffer hql = new StringBuffer( " select dt.alarm_num as alarmNum," +
"dt.alarm_date as alarmDate ," +
"dt.database_sign as databaseSign," +
"dt.alarm_info as alarmInfo," +
"dt.alarm_des as alarmDes ," +
"dt.alarm_type as alarmType ");
hql.append(" from databasealarm dt ");
hql.append(" left join monitor_log lg ");
hql.append(" on dt.alarm_num = lg.log_id ");
hql.append(" left join config_alarm cfg ");
hql.append(" on lg.monitor_id=cfg.monitor_id ");
hql.append(" left join dim_monitor_type tp ");
hql.append(" on cfg.monitor_type_id=tp.monitor_type_id ");
hql.append(" where 1=1 ");
if(databasealarmVO!=null){
if(databasealarmVO.getStartAlarmDate()!=null){
System.out.println(sdf.format(databasealarmVO.getStartAlarmDate()));
// hql.append(" and dt.alarm_date >= DATE('").append(sdf.format(databasealarmVO.getStartAlarmDate())).append("') ");
hql.append(" and dt.alarm_date >=to_date('").append(sdf.format(databasealarmVO.getStartAlarmDate())).append("','yyyy-mm-dd hh24:mi:ss') ");
}
if(databasealarmVO.getEndAlarmDate()!=null){
// hql.append(" and dt.alarm_date <=DATE('").append(sdf.format(databasealarmVO.getEndAlarmDate())).append("') ");
hql.append(" and dt.alarm_date <=to_date('").append(sdf.format(databasealarmVO.getEndAlarmDate())).append("','yyyy-mm-dd hh24:mi:ss') ");
}
if(databasealarmVO.getMonitorTypeId()!=null){
hql.append(" and tp.monitor_type_id= ").append(databasealarmVO.getMonitorTypeId()).append(" ");
}
if(databasealarmVO.getMonitorId()!=null){
hql.append(" and cfg.monitor_id= ").append(databasealarmVO.getMonitorId()).append(" ");
}
}
hql.append("order by dt.alarm_date desc ");

上面这是原生sql语句,我们只要在createSQLQuery的时候加上Transformers.aliasToBean(XXX.class),就是将返回结果进行封装,XXX.class 就是你要封装的类,如下:
		Query query = session.createSQLQuery( hql.toString())
.addScalar("alarmNum", Hibernate.STRING)
.addScalar("alarmDate",Hibernate.TIMESTAMP)
.addScalar("databaseSign", Hibernate.STRING)
.addScalar("alarmInfo", Hibernate.STRING)
.addScalar("alarmDes", Hibernate.STRING)
.addScalar("alarmType", Hibernate.STRING)
.setResultTransformer(Transformers.aliasToBean(DatabasealarmVO.class));
query.setFirstResult(pageList.getFirst());
query.setMaxResults(pageList.getObjectsPerPage());
List list = query.list();

addScalar 是显式指定返回数据的类型,这里可以指定你返回字段的类型
还有就是,在select 后面不能直接用*,得在select 后面列出你需要的列和xxx.class中的属性对应

今天在项目中无意中应用到,在这分享给大家
...全文
438 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
浮云若水 2014-06-25
  • 打赏
  • 举报
回复
楼上说的用addEntity(xxx.class) session.createSQLQuery("select * from table").addEntity(xxx.class).list; xxx.class 是table的持久化映射类才能用addEntity
浮云若水 2014-06-25
  • 打赏
  • 举报
回复
引用 1 楼 fangmingshijie 的回复:
还可以用addEntity(class)
引用 1 楼 fangmingshijie 的回复:
还可以用addEntity(class)
Transformers.aliasToBean(XXX.class) xxx.class 不受hibernate 管理
  • 打赏
  • 举报
回复
还可以用addEntity(class)
内容概要:本文提出一种基于鱼鹰优化算法(OOA)优化的CNN-BiGUR-Attention混合模,用于提升短期风电功率预测的精度与稳定性,采用Matlab实现代码仿真。该模融合卷积神经网络(CNN)提取输入数据的局部空间特征,利用双向门控循环单元(BiGUR)捕捉风速、功率等时间序列的前后向动态依赖关系,并引入注意力机制自适应强化关键时间步的特征权重,从而增强模对非平稳风电数据的表征能力;进一步,采用OOA算法对模超参数进行全局寻优,有效提升模收敛速度与泛化性能。研究基于实际风电场历史数据开展实验验证,结果表明,该方法相较传统模在预测精度、鲁棒性和误差抑制方面表现更优,适用于高比例可再生能源接入背景下的电力系统调度需求。; 适合人群:从事新能源发电预测、电力系统优化调度、智能算法与深度学习融合应用等方向的科研人员及工程技术人员,尤其适合具备Matlab编程能力、熟悉时间序列建模与深度学习框架的研究者。; 使用场景及目标:①实现风电场短期功率高精度预测,支撑电网安全稳定调度与能量管理;②为深度学习模结构设计与智能优化算法联合调参提供实践范例;③推动人工智能技术在可再生能源预测、智能电网运行等领域的落地应用。; 阅读建议:建议结合提供的Matlab代码深入理解CNN-BiGUR-Attention网络架构搭建、注意力机制实现方式及OOA优化流程,重点关注数据预处理、模训练与参数调优细节,可通过替换不同风电数据集进行对比实验,进一步掌握模迁移能力与适应性。

81,111

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧