博客向导

转载于 http://whb198900.blog.163.com/ 

 

Hibernate之映射文件配置——formula  

Property元素中的formula允许对象属性包含导出值,比如sum、average、max等的结果。如:

  1. <property name="averagePrice" formula="(select avg(pc.price) from PriceCatalogue pc, SelectedItems si where si.priceRefID=pc.priceID)"/>  

此外,formula还可以基于当前记录的特定属性值从另一个表检索值。例如:

代码
  1. <property name="currencyName" formula="(select cur.name from currency cur where cur.id= currencyID)"/>  
代码
  1. <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等提高映射灵活性,提供细粒度的解释特性,从而将其推进到一个新的级别。

你可能感兴趣的:(博客)