如何在Hibernate继承中使用连接策略查询超类时加入子类

时间:2017-06-10 14:05:31

标签: java hibernate inheritance

有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会出现性能问题。)

0 个答案:

没有答案
相关问题