Java 从Oracle Db切换到MySQL。命名查询不再工作

Java 从Oracle Db切换到MySQL。命名查询不再工作,java,mysql,hibernate,Java,Mysql,Hibernate,这对Oracle是有效的,但我们被告知要切换到MySQL。在将驱动程序信息和其他相关设置更改为指向MySQL数据库后,我无法再执行命名查询。以下是实体中定义的最简单的一个: @NamedQueryname=获取能力,query=从能力cb中选择cb,其中cb.financial_Id=:fiId 然后我有如下代码来执行查询: /* named HQL query get_capability */ select * from ( select capabilit

这对Oracle是有效的,但我们被告知要切换到MySQL。在将驱动程序信息和其他相关设置更改为指向MySQL数据库后,我无法再执行命名查询。以下是实体中定义的最简单的一个:

@NamedQueryname=获取能力,query=从能力cb中选择cb,其中cb.financial_Id=:fiId

然后我有如下代码来执行查询:

/* named HQL query get_capability */ select
    * 
from
    ( select
        capability0_.FINANCIAL_ID as FINANCIAL1_272_,
        capability0_.ACTIVE_CONNECTIONS as ACTIVE2_272_,
        capability0_.ALLOWED_CONNECTIONS as ALLOWED3_272_,
        capability0_.COMPLETE_DETAILS as COMPLETE4_272_,
        capability0_.FI_NAME as FI5_272_,
        capability0_.MESSAGE_FORMAT as MESSAGE6_272_,
        capability0_.PROVIDER_ID as PROVIDER7_272_,
        capability0_.STATUS as STATUS272_,
        capability0_.SUPPORTS_ACCOUNTS as SUPPORTS9_272_,
        capability0_.SUPPORTS_CUSTOMER as SUPPORTS10_272_,
        capability0_.SUPPORTS_IMAGE as SUPPORTS11_272_,
        capability0_.SUPPORTS_STATEMENTS as SUPPORTS12_272_,
        capability0_.SUPPORTS_TRANSACTIONS as SUPPORTS13_272_,
        capability0_.SUPPORTS_TRANSFER as SUPPORTS14_272_ 
    from
        INSTITUTION capability0_ 
    where
        capability0_.FINANCIAL_ID=? ) 
where
    rownum <= ?
query=em.createNamedQueryget_能力

。 .

query.setParameterfiId,fiId

query.setMaxResults1

cabability=Capability query.getSingleResult

最后一行引发异常:

2013-04-24 10:46:00677警告[org.hibernate.util.jdbceptionReporter]http-127.0.0.1-8080-1 SQL错误:1248,SQLState:42000

2013-04-24 10:46:00677错误[org.hibernate.util.jdbceptionReporter]http-127.0.0.1-8080-1每个派生表都必须有自己的别名

生成的SQL记录在日志文件中,如下所示:

/* named HQL query get_capability */ select
    * 
from
    ( select
        capability0_.FINANCIAL_ID as FINANCIAL1_272_,
        capability0_.ACTIVE_CONNECTIONS as ACTIVE2_272_,
        capability0_.ALLOWED_CONNECTIONS as ALLOWED3_272_,
        capability0_.COMPLETE_DETAILS as COMPLETE4_272_,
        capability0_.FI_NAME as FI5_272_,
        capability0_.MESSAGE_FORMAT as MESSAGE6_272_,
        capability0_.PROVIDER_ID as PROVIDER7_272_,
        capability0_.STATUS as STATUS272_,
        capability0_.SUPPORTS_ACCOUNTS as SUPPORTS9_272_,
        capability0_.SUPPORTS_CUSTOMER as SUPPORTS10_272_,
        capability0_.SUPPORTS_IMAGE as SUPPORTS11_272_,
        capability0_.SUPPORTS_STATEMENTS as SUPPORTS12_272_,
        capability0_.SUPPORTS_TRANSACTIONS as SUPPORTS13_272_,
        capability0_.SUPPORTS_TRANSFER as SUPPORTS14_272_ 
    from
        INSTITUTION capability0_ 
    where
        capability0_.FINANCIAL_ID=? ) 
where
    rownum <= ?
我已经了解了这个错误的含义,即每个派生表都需要一个别名,我可以编辑派生SQL,通过添加别名使其工作。我的问题是。由于这是一个派生的SQL查询,我如何告诉hibernate添加别名,或者告诉MySQL不需要别名

休眠部分配置:

例如,由于ROWNUM是MySQL中不支持的Oracle关键字,因此我认为Hibernate在构建查询时仍然以Oracle为目标

验证您是否已更改为相应的Hibernate方言


为后代添加的答案

如果FROM中的子查询是派生表,则必须命名该派生表

像这样的东西应该有用

select
    RES.field1, RES.field2 
from
    ( select
        capability0_.FINANCIAL_ID as FINANCIAL1_272_,
        capability0_.ACTIVE_CONNECTIONS as ACTIVE2_272_,
        capability0_.ALLOWED_CONNECTIONS as ALLOWED3_272_,
        capability0_.COMPLETE_DETAILS as COMPLETE4_272_,
        capability0_.FI_NAME as FI5_272_,
        capability0_.MESSAGE_FORMAT as MESSAGE6_272_,
        capability0_.PROVIDER_ID as PROVIDER7_272_,
        capability0_.STATUS as STATUS272_,
        capability0_.SUPPORTS_ACCOUNTS as SUPPORTS9_272_,
        capability0_.SUPPORTS_CUSTOMER as SUPPORTS10_272_,
        capability0_.SUPPORTS_IMAGE as SUPPORTS11_272_,
        capability0_.SUPPORTS_STATEMENTS as SUPPORTS12_272_,
        capability0_.SUPPORTS_TRANSACTIONS as SUPPORTS13_272_,
        capability0_.SUPPORTS_TRANSFER as SUPPORTS14_272_ 
    from
        INSTITUTION capability0_ 
    where
        capability0_.FINANCIAL_ID=? ) **RES**
where
    rownum <= ?

你改变了Hibernate配置中的方言了吗?我想是的。我更改了persistence.xml中的条目。相关条目现在如下所示:问题已解决。结果我在两个地方定义了hibernate方言。曾经是甲骨文的。在我改变之后,它开始工作了。感谢所有帮助过我的人。我已经添加了前面的评论作为答案,请随意添加可能对其他有类似问题的人有用的信息。