假设表每子类继承关系,可以在下面描述(来自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类而不加载任何子类???
答案 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/