hibernate应用篇——视图查询/VO对应的查询

本文探讨了在Hibernate中如何处理没有实体类对应表的查询,提供了使用`aliasToBean`将查询结果自动注入到VO对象以及转换为Map形式的方法。同时,对于视图查询的问题,提出了通过联合主键或视图作为VO对象的解决方案,以应对Hibernate因缺少主键而引发的维护异常。

本文:主要讲述没有实体类对应表的查询。本文词汇: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没有表对应。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值