本文:主要讲述没有实体类对应表的查询。本文词汇:entity 指的是有对应表的bean 。 vo 只没有表对应的bean。
一、很多时候我们常常遇见,一个复杂的查询语句查询出来的东西用Objec[Object[]]进行装在取值的时候十分麻烦还不好返回页面。这种情况提供一下几个解决办法
1,hibernate提供了类似mybatis 自动注入到vo实体中
dao.java
String hql = "select cj \"cj\" ,rq \"rq\",sl \"sl\",hj \"hj\",pj \"pj\" from v_order where 1=1 ";
List<ReportVo> list = getSession().createSQLQuery(hql).
addScalar("sl",Hibernate.LONG).
addScalar("cj", Hibernate.STRING).
addScalar("rq", Hibernate.STRING).
addScalar("hj", Hibernate.DOUBLE).
addScalar("pj", Hibernate.DOUBLE).
setResultTransformer(
Transformers.aliasToBean(ReportVo.class))
.setFirstResult((pageNo-1)*pageSize).setMaxResults(pageSize)
.list();reportVo.java
public class ReportVo {
private static final long serialVersionUID = 1L;
private String cj;
private String rq;
private long sl;
private double hj;
private double pj;
}
get/set方法省略掉了
解释:aliasToBean。顾名思义,由别名转换成对象。所以你一定要设置别名,要不会抛出异常,类型也要设置上(就是addScalar)。然后就ok了,原理我还没研究透,会在原理篇中写出来。
2.变成map形式
List list = session.createSQLQuery("select logid,content from tb_log").setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();打印结果:[{content=you are right, logid=3}, {content=you are right, logid=6}]
这种方式还是很好的。返回list<map> 形式。能完成josn操作。很简单。
二、视图问题
在hibernate中,我们可以用bean来对应表,也可以对应视图,@table(name="v_log")
但是一运行会发现一个问题,没有主键,没有主键hibernate是无法进行维护的,所以会抛出异常。
我发现的解决办法有两个
1.进行联合主键
就是用myeclipse进行反向工程,这时候会生成一个bean 这个bean中只有getId和setId ,所有字段都在一个名为id的类中,此类中重写了hashcode和equal 方法。这样你就是用了联合主键,hibernate就不会进行维护了。你可以自己进行维护。 操作就是正常的hql语句。
2.采用一中的1方法,把视图的映射看成一个vo没有表对应。
本文探讨了在Hibernate中如何处理没有实体类对应表的查询,提供了使用`aliasToBean`将查询结果自动注入到VO对象以及转换为Map形式的方法。同时,对于视图查询的问题,提出了通过联合主键或视图作为VO对象的解决方案,以应对Hibernate因缺少主键而引发的维护异常。

2万+

被折叠的 条评论
为什么被折叠?



