Добавление предиката JPA для свойства подкласса в запрос критерия - PullRequest
0 голосов
/ 27 апреля 2020

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

<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

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

...