Запрос гибернации по абстрактному классу несовместим - PullRequest
2 голосов
/ 19 августа 2011

Я столкнулся со странным несоответствием между поведением критериев и 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 голосов
/ 09 октября 2011

Критерии определяют точный тип класса из класса ParentTitle.class.Неважно, это сущность или другой класс.

Также для HQL в случае сущностей полный путь не требуется, поскольку может существовать только сущность с именем ParentTitle.

Но что такое HQLзапрос не может решить, какой класс не-сущности вы имеете в виду «из ParentTitle», потому что у вас может быть более одного класса ParentTitle, который расширяется разными сущностями.Вот почему для класса не-сущности вы должны предоставить также пакет:

list = session.createQuery("from something.somewhere.ParentTitle").list();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...