首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate使用oracle生成无效的sql

Hibernate使用oracle生成无效的sql
EN

Stack Overflow用户
提问于 2013-05-29 22:06:24
回答 1查看 1.7K关注 0票数 2

我正在使用带有Oracle11g的hibernate 4.2.1。在转换NamedQuery的过程中,hibernate显然会生成一个无效的SQL语句。NamedQuery如下所示:

代码语言:javascript
运行
复制
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如下:

代码语言:javascript
运行
复制
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中):

代码语言:javascript
运行
复制
select
    (calculrete1_.CAL_ID_CREANCE,
     calculrete1_.CAL_ID_ENSEMBLE_RET_PREST,
     calculrete1_.CAL_ID_PAIEMENT)

我只能找到一个老问题(https://hibernate.atlassian.net/browse/HHH-2409),但在这种情况下,他们指责'AS‘关键字,在这种情况下,似乎不是问题所在。

有没有人遇到过类似的问题?这可能是一个映射问题吗?

提前谢谢你,

亚历克斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-29 23:44:42

将字段列表放在方括号中,即使是微不足道的查询也会产生错误,因此Oracle不会错误地解析查询。

代码语言:javascript
运行
复制
select (1,2,3) FROM DUAL

对于旧版本的Hibernate,建议的一种解决方法是返回一个文本值,而不是EXISTS()中的字段。(https://hibernate.atlassian.net/browse/HHH-2845)

代码语言:javascript
运行
复制
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)中也提到了这个问题

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16816113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档