今天在学习传智播客的一个陕西杰信商务综合管理平台的视频教程中,无意间看到他们使用了Hibernate中formula,在这之前我并没有对formula有过了解,
Hibernate 3 之后,formula(公式,Excel 里常见的) 得到了更广泛的应用,不过这里还是简单记录一下它在 <property> 中的应用。
假如我们要映射这么一个类:
package cc.unmi.model;
public class User {
private int id;
private String name;
Private Set<Order> orders = new HashSet<Order>();
//setter & getter ......
}
User 与 Order 建立了一对多的关联,那么它在 hbm 映射文件的写法大概就是:
1
2
3
4
5
|
< property name = "name" type = "string" column = "name" > < set name = "orders" > < key column = "user_id" /> < one-to-many /> </ set > |
没错,这两个对象进行的关联,通过 user.getOrders() 可以取得与此用户关联的所有 order,user.getOrders().size() 得到订单数量。
不过有时候,我们并不关心 User 有哪些 Oder 对象,或者太多,或是待下次请求再具体查询。而是在查询 User 时只想要只道订单的数量,也是这样一个 User 对象:
01
02
03
04
05
06
07
08
09
10
|
package cc.unmi.model; public class User { private int id; private String name; Private int orderNumber; //setter & getter ...... } |
显然,orderNumber 属性在数据库表中没有相应的字段对应,如果是在 SQL 中我们可以用 count(*) ... group by id 来关联查询,其实在 hbm 映射文件中还更简单,那就是要用到 formula 了,参考配置如下:
1
2
3
|
< property name = "orderCount" type = "int" > < formula >(select count(s.id) from order s where s.user_id=id)</ formula > </ property > |
formula 也可以作为 property 的属性的。注意有几点,这里的 (select count(s.id) from order s where s.user_id=id)
1. 这是一个 sql 和 hql 的混合体
2. 红色部分为 sql 的范畴,所以要对应于数据库的表或字段
3. 蓝色的 id 出自于 hql,即当前 User bean 的 id 属性
4. 不要忘记了两边的括号哦, 因为它会作为 select * from HERE 的子查询的。