2013-04-05 49 views
0

我試圖從Hibernate條件進行查詢,但生成的查詢包含不必要的連接。請求無左外連接的兒童

我的實體映射是這樣的:

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
@Table(name="A") 
public class A { 
    @Id 
    private Long id; 

    private String champ1; 
    private String champ2; 
    private String champ3; 
} 

@Entity 
@Table(name="B") 
@PrimaryKeyJoinColumn(name="ID") 
public class B extends A {} 

@Entity 
@Table(name="C") 
@PrimaryKeyJoinColumn(name="ID") 
public class C extends A {} 

我想是這樣執行的查詢:

SELECT ID, CHAMP1, CHAMP2 FROM A WHERE CHAMP3 = ? 

我的標準是:

Criteria criteria = (Session)em.getDelegate()).createCriteria(A.class); 

ProjectionList projections = Projections.projectionList(); 
projections.add(Projections.property("id"), "id"); 
projections.add(Projections.property("champ1"), "champ1"); 
projections.add(Projections.property("champ2"), "champ2"); 

criteria.setProjection(projections); 
criteria.add(Restrictions.eq("champ3", valeur)); 

(List<A>) criteria.list(); 

生成的請求是:

SELECT 
    a.id, 
    a.CHAMP1, 
    a.CHAMP2 
FROM 
    A a 
LEFT OUTER JOIN 
    B b 
on a.ID=b.ID 
LEFT OUTER JOIN 
    C c 
on a.ID=c.ID 
WHERE 
    a.champ3 = ? 

如何才能在我的Resquest中沒有左外連接? 謝謝!

回答

0

@org.hibernate.annotations.Entity(polymorphisms = PolymorphismType.EXPLICIT)添加到您的父級,或將Restrictions.eq("class", A.class)添加到標準。

+0

謝謝你的答案,但我嘗試您的解決方案和生成的查詢現在是:選擇 \t \t a.id, a.CHAMP1, a.CHAMP2, 從 A中的 左外連接 B B 上a.ID = b.ID 左外連接 C C 上a.ID = c.ID \t其中 \t情況 當b.ID不爲空則1 時c.ID不爲空,然後2 當a.ID不爲空時,則0 end =? \t \t a.champ3 =? – Christophe 2013-04-05 14:23:26

+0

用哪種解決方案?你有沒有獨立嘗試? – Jeff 2013-04-09 19:23:01

+0

這也不適合我。我嘗試過註釋父類和子類,但沒有運氣。 – svlada 2015-04-19 19:16:18