假设我们现在有一个DTO,其属性包括两张表的属性,我们现在需要将sql语句查询得到的内容转为一个DTO对象,其解决方法如下:
方法一:
SQLQuery query = session.createSQLQuery("select a.id as areaId,a.name as areaName,c.id as screenId,c.name as screenName from HPS_ParkingLotArea a left join HPS_ParkingLotScreen c on a.screenId = c.id ");
List list = query
.addScalar("areaId",Hibernate.INTEGER)
.addScalar("areaName",Hibernate.STRING)
.addScalar("screenId",Hibernate.INTEGER)
.addScalar("screenName",Hibernate.STRING)
.setResultTransformer(Transformers.aliasToBean(AreaWithScreen.class)).list();
return list;
在执行完sql语句之后,取到相应的属性,并赋予其类型,最后借助aliasToBean来转化为相应的类的实例。(此类无需有其他构造方法)
方法二:
Query q = session.createQuery("select new com.hibernate.MsgInfo(m.id, m.cont, m.topic.title, m.topic.category.name) from Msg m");
List<MsgInfo> list=q.list();
其中,MsgInfo是DTO。值得留意的是,第二种方法中DTO必须提供带参数的构造方法,并且HQL语句中属性的位置要与构造方法中的位置逐一对应。
对于DTO对象要注意,是int还是Integer。如果是int,但set方法中的方法也是int,则如果为空,会报错。
作者:angus_17 发表于2013-3-1 17:06:41
原文链接