最近一周在做一些查询的优化,看着一两年前写的东西就在抱怨 为什么原先不这么这么写......
好吧,谁让你一开始就没定下所谓的业务呢......
其实优化工作很简单,去除无用的表连接,不过因为整个查询是由criteria构建,所以你的VO关系决定了你的criteria path是不是最优的。
原来的逻辑是A -> AB -> B -> C
由于B是一张KW级别的表,加上C有B字段
所以就改成 A-> AB -> C,
在AB中建个关联 到 C
如下:
不过很可惜,因为AB 中已经有个以B_ID 为外键关联到B了,而AB是复合主键,所以在写上述的mapping时候会报
foreign key must have same number of columns as the referenced primary key.
它把复合主键给你和B_id给mapping 上了,真够傻X的,难道就不能关联单个么。
好吧,改成
就OK了
好吧,谁让你一开始就没定下所谓的业务呢......
其实优化工作很简单,去除无用的表连接,不过因为整个查询是由criteria构建,所以你的VO关系决定了你的criteria path是不是最优的。
原来的逻辑是A -> AB -> B -> C
由于B是一张KW级别的表,加上C有B字段
所以就改成 A-> AB -> C,
在AB中建个关联 到 C
如下:
class A{
.......
}
class B{
......
}
class AB{
private A a;
private B b;
private Set<C> c = new HashSet<C>(0);
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "B_ID")
public Set<C> getC(){
return c;
}
}
class C{
private B b
}
不过很可惜,因为AB 中已经有个以B_ID 为外键关联到B了,而AB是复合主键,所以在写上述的mapping时候会报
foreign key must have same number of columns as the referenced primary key.
它把复合主键给你和B_id给mapping 上了,真够傻X的,难道就不能关联单个么。
好吧,改成
class AB{
private A a;
private B b;
private Set<C> c = new HashSet<C>(0);
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "B_ID",referencedColumnName="B_ID")
public Set<C> getC(){
return c;
}
}
就OK了