У меня есть следующая иерархия классов / отображение гибернации:
<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, оно также приветствуется.
Спасибо, Томас