表每子类继承关系:如何在不加载任何子类的情况下查询Parent类??? (休眠)

时间:2010-04-23 17:37:01

标签: java performance hibernate inheritance hql

假设表每子类继承关系,可以在下面描述(来自wikibooks.org - 请参阅here

注意父类不是抽象

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Project {

    @Id
    private long id;

    // Other properties

}

@Entity
@Table(name="LARGEPROJECT")
public class LargeProject extends Project {

    private BigDecimal budget;

}

@Entity
@Table(name="SMALLPROJECT")
public class SmallProject extends Project {

}

我有一个场景,其中我只需要检索父类。由于性能问题,我应该做什么运行HQL查询以便检索Parent类而只需 Parent类而不加载任何子类???

3 个答案:

答案 0 :(得分:7)

解决方法如下所述:

将您的Parent类定义为 MappedSuperClass 。假设父类映射到PARENT_TABLE

@MappedSuperClass
public abstract class AbstractParent implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @Column(table="PARENT_TABLE")        
    private String someProperty;

    // getter's and setter's

}

对于每个子类,扩展AbstractParent类并定义其 SecondaryTable 。父类中定义的任何持久字段都将映射到 SecondaryTable 定义的表。最后,如果需要,使用AttributeOverrides

@Entity
@SecondaryTable("PARENT_TABLE")
public class Child extends AbstractParent {

    private String childField;

    public String getChildProperty() {
        return childField;
    }

}

定义另一个实体,目的是只检索父类

@Entity
@Table(name="PARENT_TABLE")
@AttributeOverrides({
    @AttributeOverride(name="someProperty", column=@Column(name="someProperty"))
})
public class Parent extends AbstractParent {}

没有别的。如上所示,我只使用了JPA特定注释

答案 1 :(得分:4)

更新:看来第一个选项无法正常工作。

<击>

<击>

第一个选项:

在where子句中指定类:

select p from Project p where p.class = Project 

<击>

第二个选项:

使用可以使用Hibernate的@Entity注释设置的显式多态:

@javax.persistence.Entity
@org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT)
@Inheritance(strategy = InheritanceType.JOINED)
public class Project {

    @Id
    private long id;
    ...
}

这是Hibernate Core文档中有关explicit polymorphism的内容:

  

隐含多态意味着   班级的实例将是   由任何命名的查询返回   超类或实现的接口或   类,以及任何实例   将返回该类的子类   通过命名该类的查询   本身。显式多态意味着   将返回该类实例   仅通过明确命名的查询   那个班。

另见

答案 2 :(得分:0)

实际上,有一种方法可以获得超类,你只需要使用JPA的本机查询,在我的情况下,我使用JPA存储库就是这样的:

@Query(value = "SELECT * FROM project", nativeQuery = true)
List<Resource> findAllProject();

标志nativeQuery为true允许在数据库上运行本机SQL。

如果您使用的是实体管理器,请查看以下内容:https://www.thoughts-on-java.org/jpa-native-queries/