Hibernate, как создать псевдоним на свойстве подкласса - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть следующая иерархия классов / отображение гибернации:

<class name="Document"
       table="KP_DOCUMENT">
    ...
</class>

<subclass name="CurrentAccountDocument"
          extends="Document"
          lazy="false">
    <many-to-one name="bankAccount"
                 class="CurrentAccount"
                 column="IBAN"
                 access="field"
                 not-null="true"
                 lazy="false"
                 cascade="none"/>
</subclass>

<class name="CurrentAccount"
       table="KP_CURRENTACCOUNT">
    <id name="iban"
        column="IBAN"
        type="string"
        access="field"/>
    <property name="baseNumber"
              column="BASENR"
              type="string"
              access="property"/>
    ...
</class>

Мне нужно включить свойства класса BankAccount в качестве ограничений в запросе для выбора объектов класса Документ . Поэтому мне нужно создать псевдоним для свойства многие-к-одному bankAccount в классе CurrentAccountDocument , который является подклассом Document . Поэтому, когда я пытаюсь сделать следующее:

Criteria criteria = session.createCriteria(Document.class);
criteria.createAlias("bankAccount", "bankAccount");
queryCriterion = Restrictions.eq("bankAccount.baseNumber", "35300");
criteria.add(queryCriterion);
return criteria.list();

... это приводит к следующему исключению:

org.hibernate.QueryException: could not resolve property: bankAccount of: Document

Я могу получить доступ к "обычным" свойствам подкласса с другими ограничениями. Однако с createAlias ​​() это не работает. Как это сделать правильно?

Кстати, я пробовал то же самое с API критериев JPA, как это:

CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery<Document> criteriaQuery = criteriaBuilder.createQuery(Document.class);
Query<Document> documentRoot = criteriaQuery.from(Document.class);
Join joinBankAccount = documentRoot.join("bankAccount");

или альтернативно

Join joinBankAccount = criteriaBuilder.treat(documentRoot, CurrentAccountDocument.class).join("bankAccount");
Predicate queryPredicate = criteriaBuilder.equal(joinBankAccount.get("baseNumber"), "4711");
criteriaQuery.select(documentRoot).where(queryPredicate);
query = session.createQuery(criteriaQuery);
return query.getResultList();

... который приводит к аналогичному исключению:

Caused by: org.hibernate.QueryException: could not resolve property: bankAccount of: Document [select generatedAlias0 from Document as generatedAlias0 inner join generatedAlias0.documentContent as generatedAlias1 inner join generatedAlias0.bankAccount as generatedAlias2 where generatedAlias2.baseNumber=:param0 order by generatedAlias1.creationTimeStamp desc]
at org.hibernate.QueryException.generateQueryException(QueryException.java:120)
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:220)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:158)
at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:611)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:720)

Из-за других проблем с API JPA я переключился на устаревший API критериев гибернации, пока JPA не будет работать правильно. Поэтому, пожалуйста, скажите мне, как это работает с Hibernate. Если у вас есть решение с JPA, оно также приветствуется.

Спасибо, Томас

1 Ответ

0 голосов
/ 29 апреля 2020

Исключение, которое вы получаете, является правильным. Объект «Документ» не имеет свойства bankAccount. Суперкласс не имеет доступа к переменным-членам подкласса. Отсюда исключение. Одним из решений будет создание свойства в объекте документа. Другой вариант - создать запрос к подклассу, а не к родительскому классу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...