![](/img/trans.png)
[英]Table per Class hierarchy - get only Superclass with Criteria API, discriminator not working?
[英]Retrieve only the superclass from a class hierarchy
我有一個場景如下:
@Entity
@Table(name = "ANIMAL")
@Inheritance(strategy = InheritanceType.JOINED)
public class Animal implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "S_ANIMAL")
@SequenceGenerator(name = "S_ANIMAL", sequenceName = "S_ANIMAL", allocationSize = 1)
public int getNumero() {
return numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
.
.
.
}
並作為子類:
@Entity
@Table(name = "DOG")
public class Dog extends Animal {
private static final long serialVersionUID = -7341592543130659641L;
.
.
.
}
我有這樣的 JPA Select 語句:
SELECT a FROM Animal a;
我正在使用 Hibernate 3.3.1
正如我所看到的,框架使用左外連接檢索Animal
和Dog
的實例。
有沒有辦法 Select 只有“部分” Animal
? 我的意思是,之前的Select
將獲得所有的Animal
,那些只是Animal
而不是Dog
的,以及那些是Dog
的。
我想要它們,但對於Dog
的情況,我只想檢索它們的“動物部分”。
我找到了@org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT)
但我可以看到這只有在 Animal 不是@Entity
時才有效。
非常感謝。
簡短回答:您描述的行為符合JPA標准。 沒有JPA標准方法來限制JPA提供程序僅檢索超類。
提供者可以選擇查詢實現邏輯來實現功能,一致性和性能。 只要它尊重您的實體注釋並在查詢中返回所請求的信息,一切都很好。 將Dog的外部聯接視為私有實現細節,不應該與您有關。 提供程序已編寫外部聯接以協助性能和一致性。
考慮:
實際上,有一種方法可以獲得超類:您只需要使用JPA的本機查詢。 就我而言,我正在使用JPA存儲庫。 因此,它會是這樣的:
@Query(value = "SELECT * FROM animal", nativeQuery = true)
List<Resource> findAllAnimal();
標志nativeQuery為true允許在數據庫上運行本機SQL。
如果您使用的是Entity Manager,請查看以下內容: https : //www.thoughts-on-java.org/jpa-native-queries/
Hibernate 使用屬性“clazz_”來確定子類。
例子:
select
animal0_.animal_id as animal_i1_0_,...,
case
when animal0_1_.animal_id is not null then 1
when animal0_2_.animal_id is not null then 2
when animal0_.animal_id is not null then 0
end as clazz_
from animal animal0_
left outer join dog animal0_1_ on animal0_.animal_id=animal0_1_.animal_id
left outer join cat animal0_2_ on animal0_.animal_id=animal0_2_.animal_id
您應該使用“ 0 AS clazz_ ”指定 SQL
@Query(value = "SELECT *, 0 AS clazz_ FROM animal", nativeQuery = true)
List<Animal> findAllAnimal();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.