hibernate 中,有时候需要比较复杂的业务,比如需要从很多张表里面抽取数据,这时候就需要我们自定义结果集了。
假设:我需要分别从 7张表里面 分别取 a,b,c,d,e,f,g,h 字段。在原先的映射文件不满足的情况下,我建立了含有这些字段的实体bean.
1.Dao 的写法:
String sql = "...";
Session session = super.getSessionFactory().getCurrentSession();
SQLQuery query= session.createSQLQuery(sql.toString());
query.setResultTransformer(Transformers.aliasToBean(bean.class));//自定义bean
2. 当然这只是一种我比较喜欢的方式,hibernate 还提供了很多,具体请参与hibernate 的官方文档: Native SQL查询
3.值得注意的是Oracle 有些返回方式比较不一致,有些默认返回大写字段了,就会找不到Setter 方法。
处理办法是:
Query query = getCurrentSession().createSQLQuery(sql)
.addScalar("poNumber").addScalar("你自定义的字段名称");
还有一种:
select
po_number \"po_number\",
payment_id \"payment_id\",
sum(invoice_amount) \"total_money\"
from table;
经过转义一下,第一种不方便封装。第二种可读性差了。自己感觉吧。
还有更好的方式,希望能提供建议。不知道map 方便不。
4.在返回类型上,经常会出现 错误。比如 oracle 字段A 类型Number ,你实体定义为Integer 等类型会出错。
这里解决方法是,定义为Object类型,或者查询A的时候 加上||‘’,强制返回字符串。