在一个项目的某一个查询场景中,TEACHER表是主表,STUDENT表是TEACHER的子表,二者是以一对多的方式关联。业务逻辑须要查询多条TEACHER表的数据,而且在查询出每条A表数据的同时还须要将对应STUDENT表的行数取出来。咱们固然能够利用Hibernate先将每条TEACHER数据load进来之后再以TEACHER.getStudents().size()这种方式取得对应的行数,可是代码会显得很繁琐而且增长了许多须要执行的SQL语句,有没有什么替代的方法呢? java
咱们可使用Hiberante的formula。 spa
为了解决前面提到的问题,咱们只须要在TEACHER 的orm配置文件里加上这样一个property,定义其formula属性以下: code
... <property name="rowCount" formula="(select count(*) from STUDENT a where a.ID=teacherId)" type="java.lang.String" /> ...
经过这种方式咱们就能够在取得每个TEACHER持久化对象的时候就方便的获得了须要的统计信息,能够大幅度的提升咱们的开发效率。注意这里不仅仅能够用来统计记数,还能够用于sum,avg等其余统计。 orm
在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。这样就大大提升了对象关系映射的灵活性,从而支持对复杂数据 模型的更为细粒度的解释。 xml
从3.x开始,Hibernate 使用formula、filter、subselect等提升映射灵活性,提供细粒度的解释特性,从而将其推动到一个新的级别。 对象