2013-05-29 33 views
2

我在用Oracle11g使用hibernate 4.2.1。在翻譯NamedQuery的過程中,顯然hibernate會生成無效的SQL語句。該NamedQuery如下:Hibernate用oracle生成無效的sql

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的主鍵。

生成的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:缺少右括號。如果我刪除這部分兩個括號我可以執行沒有問題的查詢(在的SQLDeveloper爲例):

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

我只能找到一個老問題(https://hibernate.atlassian.net/browse/HHH-2409),但在這種情況下,他們指責「AS '這個關鍵詞在這種情況下似乎不成問題。

有沒有人遇到過類似的問題?這可能是一個映射問題嗎?

由於提前,

亞歷

+0

聽起來像Oracle查詢分析器再次被討厭的..;) –

回答

2

把括號內的一個字段列表將產生甚至瑣碎的查詢錯誤,所以它不是甲骨文正確分析查詢。

select (1,2,3) FROM DUAL 

一種解決方法建議舊版本休眠的是在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

+0

感謝布賴恩,是解決這個問題。 – Alex