2011-08-18 73 views
2

我遇到了Criteria和HQL查詢行爲之間奇怪的不一致。簡化的域模型:抽象類的Hibernate查詢不一致

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@Table("TITLES") 
public abstract class ParentGroup {} 

// no JPA annotations 
public abstract class ParentTitle extends ParentGroup {} 

@Entity 
@DiscriminatorValue("SUB_CHILD") 
public class SubTitle extends ParentTitle {} 

下面是顯示了奇怪的行爲測試:

@Test 
public void testQueryByAbstractSuperClass() { 
    List<ParentTitle> list = session.createCriteria(ParentTitle.class).list(); 
    assertEquals(1, list.size()); //passes 

    list = session.createQuery("from ParentTitle").list(); //exception thrown 
    assertEquals(1, list.size()); 
} 

但下列情況除外:

org.hibernate.hql.ast.QuerySyntaxException: ParentTitle is not mapped [from ParentTitle] 

爲什麼HQL查詢不工作?

回答

0

Criteria從ParentTitle.class中解決類的確切類型。它是無關緊要的實體或其他類。

另外對於HQL在實體情況下不需要完整路徑,因爲只能有實體名爲ParentTitle。

但是HQL查詢無法解決的是您從「ParentTitle」中指的是哪個非實體類,因爲您可以使用 具有多個由不同實體擴展的ParentTitle類。這就是爲什麼你需要提供 非實體類也包:

list = session.createQuery("from something.somewhere.ParentTitle").list();