Hibernate查询由抽象类不一致

时间:2011-08-18 21:38:40

标签: hibernate jpa jpql

我在Criteria和HQL查询的行为之间遇到了一种奇怪的不一致。简化域模型:

@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查询不起作用?

1 个答案:

答案 0 :(得分:0)

Criteria从ParentTitle.class中解析类的确切类型。它与实体或其他类无关。

对于HQL,在实体的情况下不需要完整路径,因为只能有名为ParentTitle的实体。

但是HQL查询无法解决的问题是“来自ParentTitle”的非实体类,因为你可以 有多个ParentTitle类,由不同的实体扩展。这就是为什么 您必须提供的非实体类包:

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