2

鑑於以下類型的層次結構:JPA/Hibernate查詢多態場

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
class A { } 

@Entity 
class B extends A { 
    String b; 
} 

@Entity 
class C extends A { 
    String c; 
} 

@Entity 
class D { 
    @ManyToOne 
    A a; 
} 

現在我想查詢類型d的所有記錄與C型和現場「C」的「A」等於給定的字符串參數:

... 
Root<D> root 
CriteriaBuilder cb 
cb.equal(root.get("a").get("c").as(String.class), "Test"); 
... 

由於可預見的,我會得到一個異常告訴我,屬性「C」是未知的,因爲它不是在超A.定義

任何想法,如何告訴JPA查詢,它應該只有j oin C在D的字段'a'並向字段'c'添加一個條件?

回答

1
CriteriaQuery<Tuple> q = criteriaBuilder.createTupleQuery(); 
    Root<D> from = q.from(D.class); 
    Join<D, A> path = from.join(D_.a); 
    q.multiselect(path.get(A_.id)).where(criteriaBuilder.equal(path.type(), C.class));