我在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查询不起作用?
答案 0 :(得分:0)
Criteria从ParentTitle.class中解析类的确切类型。它与实体或其他类无关。
对于HQL,在实体的情况下不需要完整路径,因为只能有名为ParentTitle的实体。
但是HQL查询无法解决的问题是“来自ParentTitle”的非实体类,因为你可以 有多个ParentTitle类,由不同的实体扩展。这就是为什么 您必须提供的非实体类包:
list = session.createQuery("from something.somewhere.ParentTitle").list();