有3个类:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Animal extends BaseEntity {
String eye;
public String getEye() {
return eye;
}
public void setEye(String eye) {
this.eye = eye;
}
}
@Entity
public class Cat extends Animal {
String catName;
public String getCatName() {
return catName;
}
public void setCatName(String catName) {
this.catName = catName;
}
}
@Entity
public class Dog extends Animal {
String dogName;
public String getDogName() {
return dogName;
}
public void setDogName(String dogName) {
this.dogName = dogName;
}
}
当查询Animal时,Hibernate会像这样生成SQL:
SELECT
animal0_.id AS id1_7_0_,
animal0_.eye AS eye2_7_0_,
animal0_1_.catName AS catName1_8_0_,
animal0_2_.dogName AS dogName1_9_0_,
CASE
WHEN animal0_1_.id IS NOT NULL
THEN 1
WHEN animal0_2_.id IS NOT NULL
THEN 2
WHEN animal0_.id IS NOT NULL
THEN 0
END AS clazz_0_
FROM
Animal animal0_
LEFT OUTER JOIN Cat animal0_1_
ON animal0_.id = animal0_1_.id
LEFT OUTER JOIN Dog animal0_2_
ON animal0_.id = animal0_2_.id
WHERE animal0_.id = ?
就像Hibernate_User_Guide所说的那样。
所以,问题是:如何在查询超类时避免加入子类? 大多数情况下,只需要超类中的属性 - 只需忽略它的子类!
(想象动物有很多子类,如Bird,Pig,Fish,Insect ......在这种情况下,Animal-query会出现性能问题。)