转载于 http://whb198900.blog.163.com/
Hibernate之映射文件配置——formula
Property元素中的formula允许对象属性包含导出值,比如sum、average、max等的结果。如:
- <property name="averagePrice" formula="(select avg(pc.price) from PriceCatalogue pc, SelectedItems si where si.priceRefID=pc.priceID)"/>
此外,formula还可以基于当前记录的特定属性值从另一个表检索值。例如:
- <property name="currencyName" formula="(select cur.name from currency cur where cur.id= currencyID)"/>
- <property name="schNum" formula="(select max(a.schoolNumb) from sys_act_code as a)"/>
注意:
1,formula="()",里面的是sql语句,字段和表名都应该和数据库相应,而不是字段,若带有参数如cur.id= currencyID,这个currencyID才是对象的东东.
2,formula="( sql )",这个括号不能少,不然会报错,我试了几次,没括号就报错,添上就没问题
3,操作字段一定要用别名
问题:
1,org.springframework.orm.hibernate3.HibernateSystemException: Null value was assigned to a property of primitive type setter of
没用别名,会出现这个错误,添个别名就好了
2,如果我要用obj.getSchNum()得到想要的值,该对象(obj)必须是hibernate取得的对象,
3,如果要传入参数,如上面那个,currencyID是该对象的属性,它的值也是有hibernate操作当前对象时,把该属性对应的值自动传入进去.
---------------------------------------------
hibernate-formula-场景one
2012-03-01 17:30:41| 分类: Hibernate | 标签: |字号大中小 订阅
在一个项目的某一个查询场景中,TEACHER表是主表,STUDENT表是TEACHER的子表,两者是以一对多的方式关联。业务逻辑需要查询多 条TEACHER表的数据,并且在查询出每条A表数据的同时还需要将对应STUDENT表的行数取出来。我们当然可以利用Hibernate先将每条 TEACHER数据load进来以后再以TEACHER.getStudents().size()这种方式取得对应的行数,但是代码会显得很繁琐并且增 加了许多需要执行的SQL语句,有没有什么替代的方法呢?
我们可以使用Hiberante的formula。
为了解决前面提到的问题,我们只需要在TEACHER 的orm配置文件里加上这样一个property,定义其formula属性如下:
----------------------------
<property name="rowCount"
formula="(select count(*) from student a where a.ID= teacherId)"
type="java.lang.String" />
-----------------------------
通过这种方式我们就可以在取得每一个TEACHER持久化对象的时候就方便的得到了需要的统计信息,可以大幅度的提高我们的开发效率。注意这里不单单可以用来统计记数,还可以用于sum,avg等其他统计。
在Hibernate 3.x之前,formula属性只能够出现在property元素中。现在仍然可以这样做,但是Hibernate 3.x提供了一个formula属性或元素(两者在formula的用法方面实质上是等效的),可以在许多元素中使用,包括discriminator、 many-to-one、one-to-one、element、many-to-many、map-key、map-key-many-to-many 和property。这样就大大提高了对象关系映射的灵活性,从而支持对复杂数据 模型的更为细粒度的解释。
从3.x开始,Hibernate 使用formula、filter、subselect等提高映射灵活性,提供细粒度的解释特性,从而将其推进到一个新的级别。