2

Oracle11gで休止状態4.2.1を使用しています。NamedQuery の変換中に、明らかに hibernate が無効な SQL ステートメントを生成します。NamedQuery は次のようになります。

SELECT retenues FROM EnsembleRetenuesPrestation retenues
WHERE EXISTS (SELECT calcul FROM CalculRetenueGlobale calcul
              WHERE calcul.id.payementPrestation.id = :payementId
              AND calcul.id.ensembleRetenuesPrestation.id = retenues.id)

CalculRetenueGlobale は、EnsembleRetenuesPrestation と PayementPrestation の結合テーブルです (いくつかのフィールドが追加されているため、実際のエンティティです)。これは、CalculRetenueGlobale と PayementPrestation の 2 つのエンティティを含む埋め込みキーを主キーとして使用します。

生成された SQL は次のとおりです。

select
    ensemblere0_.ERP_ID_ENSEMBLE_RET_PREST as ERP1_24_,
    ensemblere0_.ERP_AAAAMM_ARRERAGES as ERP2_24_,
    ensemblere0_.ERP_CODE_CALCUL_SIMUL as ERP3_24_,
    ensemblere0_.ERP_ID_EXCEDENT_RETENUE as ERP19_24_,
    ensemblere0_.ERP_FLAG_5E_TRANCHE_CESSION as ERP4_24_,
    ensemblere0_.ERP_FLAG_ARRERAGES as ERP5_24_,
    ensemblere0_.ERP_MONTANT_APRES_RETENUES as ERP6_24_,
    ensemblere0_.ERP_MONTANT_AVANT_RETENUES as ERP7_24_,
    ensemblere0_.ERP_MONTANT_CESSIBLE as ERP8_24_,
    ensemblere0_.ERP_MONTANT_INCESS_INSAISISS as ERP9_24_,
    ensemblere0_.ERP_MONTANT_SAISISSABLE as ERP10_24_,
    ensemblere0_.ERP_RETENUE_ACOMPTE as ERP11_24_,
    ensemblere0_.ERP_RETENUE_ACOMPTE_FIXE as ERP12_24_,
    ensemblere0_.ERP_RETENUE_CONJOINT_TIERS as ERP13_24_,
    ensemblere0_.ERP_RETENUE_FAILLITE as ERP14_24_,
    ensemblere0_.ERP_RETENUE_SURENDETTEMENT as ERP15_24_,
    ensemblere0_.ERP_SOM_RET_ALIM as ERP16_24_,
    ensemblere0_.ERP_SOM_RET_CESSION as ERP17_24_,
    ensemblere0_.ERP_SOM_RET_SAISIES as ERP18_24_ 
from
    CCRSC.ENSEMBLE_RET_PREST ensemblere0_ 
where
    exists (
        select
            (calculrete1_.CAL_ID_CREANCE,
            calculrete1_.CAL_ID_ENSEMBLE_RET_PREST,
            calculrete1_.CAL_ID_PAIEMENT)
        from
            CCRSC.CALC_RET_GLOBALE calculrete1_ 
        where
            calculrete1_.CAL_ID_PAIEMENT=1
            and calculrete1_.CAL_ID_ENSEMBLE_RET_PREST=ensemblere0_.ERP_ID_ENSEMBLE_RET_PREST
    )

結果は ORA-00907: 右括弧がありません。この部分の 2 つの括弧を削除すると、クエリを問題なく実行できます (たとえば、SQLDeveloper で)。

select
    (calculrete1_.CAL_ID_CREANCE,
     calculrete1_.CAL_ID_ENSEMBLE_RET_PREST,
     calculrete1_.CAL_ID_PAIEMENT)

私は古い問題 ( https://hibernate.atlassian.net/browse/HHH-2409 ) しか見つけることができませんでしたが、この場合、問題ではないように思われる「AS」キーワードを非難しています。

誰かがすでに同様の問題に遭遇しましたか? これはマッピングの問題でしょうか?

前もって感謝します、

アレックス

4

1 に答える 1

4

フィールド リストを角かっこで囲むと、些細なクエリでもエラーが発生するため、Oracle がクエリを正しく解析していません。

select (1,2,3) FROM DUAL

古いバージョンの Hibernate に推奨される回避策は、EXISTS() でフィールドではなくリテラル値を返すことです。( https://hibernate.atlassian.net/browse/HHH-2845 )

SELECT retenues FROM EnsembleRetenuesPrestation retenues
WHERE EXISTS (SELECT 1 FROM CalculRetenueGlobale calcul
              WHERE calcul.id.payementPrestation.id = :payementId
              AND calcul.id.ensembleRetenuesPrestation.id = retenues.id)

この問題は ( https://hibernate.atlassian.net/browse/HHH-5998 )にも記載されています。

于 2013-05-29T15:44:42.063 に答える