2017-03-20 105 views
1

考慮以下父類實體:休眠產生曖昧的SQL查詢

@Entity 
@Table(schema = "iwrs") 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class ParentClass { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PK_IWRS") 
    public int id; 

    public String name; 

    public ParentClass(String name) { 
     this.name = name; 
    } 
} 

而下面ChildClass實體:

@Entity 
@Table(schema = "iwrs") 
public class ChildClass extends ParentClass { 

    @ManyToOne(targetEntity=ParentClass.class) 
    @JoinColumn(name="parent_id") 
    private ParentClass parent; 

    public ChildClass(String name) { 
     super(name); 
    } 
} 

正如你可以看到,這個ChildClass從父類延伸。此外,它還包含一個ParentClass參考,映射在父級字段中。

有一點我想獲得所有的ParentClass實例,但不是ChildClass的實例。

我找遍四周,發現可以用這個標準來實現:

Criteria criteria = sessionFactory.getCurrentSession() 
       .createCriteria(ParentClass.class, "parentClass") 
       .add(Restrictions.eq("class", ParentClass.class)); 

然而,當我嘗試列出它,我得到以下錯誤:

ERROR SqlExceptionHelper:147 - ERROR: column reference "clazz_" is ambiguous

如果我刪除條件的最後一行,查詢成功執行。但是ChildClass實例也被返回,這不是我想要的。

這裏是由Hibernate生成的查詢時,我有所有的限制:

select this_.id as id1_29_1_, this_.name as name2_29_1_, this_.parent_id as parent_i1_14_1_, this_.clazz_ as clazz_1_, parentclas2_.id as id1_29_0_, parentclas2_.name as name2_29_0_, parentclas2_.parent_id as parent_i1_14_0_, parentclas2_.clazz_ as clazz_0_ from (select id, name, null::int4 as parent_id, 0 as clazz_ from iwrs.parent_class union all select id, name, parent_id, 1 as clazz_ from iwrs.child_class) this_ left outer join (select id, name, null::int4 as parent_id, 0 as clazz_ from iwrs.parent_class union all select id, name, parent_id, 1 as clazz_ from iwrs.child_class) parentclas2_ on this_.parent_id=parentclas2_.id where clazz_=?

工作示例可以在這裏找到:https://github.com/mmalmeida/hibernateTest,只需運行測試RetrieveParentTest.java。

你知道我該如何解決這個問題嗎?

提前致謝!

回答

2

嘗試使用您定義的別名:

Criteria criteria = sessionFactory.getCurrentSession() 
        .createCriteria(ParentClass.class, "parentClass") 
        .add(Restrictions.eq("parentClass.class", ParentClass.class)); 
+0

嘿malvarez,感謝您的輸入。不幸的是,它給出了同樣的錯誤。我也檢查了由hibernate生成的查詢,並且在兩種情況下都完全相同。 – micdcar

+0

對不起,它沒有工作。你能用Hibernate生成的查詢更新你的問題嗎? – malvarez

+0

當然,將這樣做;) – micdcar