У меня есть следующая иерархия отображения классов / гибернации:
<class name="Document"
table="KP_DOCUMENT">
<discriminator formula="DOCUMENTTYPE"/>
<property name="documentType"
column="DOCUMENTTYPE"
access="field">
<type name="HibernateTypeStringToEnum">
<param name="enumClass">DocumentType</param>
<param name="databaseValues">CPAC, COGR, CAPC, CAST, GCAS, GASA, PCAT</param>
<param name="enumValues">
CERTIFIED_PUBLIC_ACCOUNTANT_CONFIRMATION,
COST_GRID,
CURRENT_ACCOUNT_PAYMENT_CHARGES,
CURRENT_ACCOUNT_STATEMENT,
GUARANTEE_CREDIT_ACCOUNT_STATEMENT,
GUARANTEE_CREDIT_ACCOUNT_STATEMENT_OF_ACCOUNT,
PRICE_CATALOG
</param>
</type>
</property>
...
</Document>
<subclass name="GuaranteeCreditAccountStatementOfAccount"
extends="Document"
discriminator-value="GASA"
lazy="false">
<property name="baseNumber"
column="BASENUMBER"
type="string"
access="field"/>
</subclass>
Когда я использую следующий предикат для выбора объектов типа Документ , только GuaranteeCreditAccountStatementOfAccount объекты выбраны, но нет других документов, которые соответствуют типам документов первого предиката предложения или (testsBuilder.in (document Root .get ("documentType")). value (documentTypes)) :
Predicate queryPredicate = criteriaBuilder.or(criteriaBuilder.in(documentRoot.get("documentType")).value(documentTypes),
criteriaBuilder.and(criteriaBuilder.equal(documentRoot.type(), GuaranteeCreditAccountStatementOfAccount.class),
criteriaBuilder.equal(criteriaBuilder.treat(documentRoot, GuaranteeCreditAccountStatementOfAccount.class).get("baseNumber"), "0011959")));
Если я делаю то же самое с устаревшим языком критериев гибернации, он работает:
Criterion queryCriterion = Restrictions.or(Restrictions.in("documentType", documentTypes),
Restrictions.and(Restrictions.eq("class", GuaranteeCreditAccountStatementOfAccount.class),
Restrictions.eq("baseNumber", "0011959")));
Может кто-нибудь сказать мне, как сделать то же самое с API критериев JPA.
Я использую спящий режим версии 5.4.3
Спасибо, Томас