【问题标题】:Switched from Oracle Db to MySQL. Named query no longer works从 Oracle Db 切换到 MySQL。命名查询不再有效
【发布时间】:2015-08-11 03:19:36
【问题描述】:

这适用于 Oracle,但我们被告知要切换到 MySQL。在更改驱动程序信息和其他相关设置以指向 MySQL 数据库后,我不再能够执行我的命名查询。这是Entity中定义的最简单的一个:

@NamedQuery(name="get_capability", query="select cb from Capability cb where cb.financial_Id = :fiId")

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

query = em.createNamedQuery("get_capability");

。 . .

query.setParameter("fiId", fiId);

query.setMaxResults(1);

cabability = (Capability) query.getSingleResult();

最后一行抛出异常:

2013-04-24 10:46:00,677 WARN [org.hibernate.util.JDBCExceptionReporter] (http-127.0.0.1-8080-1) SQL 错误:1248,SQLState:42000

2013-04-24 10:46:00,677 错误 [org.hibernate.util.JDBCExceptionReporter] (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 不需要它?

休眠部分配置:

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />   
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
<property name="hibernate.showSql" value="true" /> 
<property name="hibernate.format_sql" value="true"/> 
<property name="hibernate.use_sql_comments" value="true"/>

【问题讨论】:

  • 你是否在 Hibernate config 中更改了方言?
  • 我相信是的。我更改了persistence.xml 中的条目。相关条目现在如下所示:
  • 问题已解决。事实证明,我在两个地方定义了休眠方言。曾经仍然为 Oracle 设置。在我改变它之后,它开始工作了。感谢所有提供帮助的人。
  • 我已经添加了之前的评论作为答案,请随时添加可能对遇到类似问题的其他人有用的信息。

标签: java mysql hibernate


【解决方案1】:

由于ROWNUM 是 MySQL 不支持的 Oracle 关键字(例如,请参阅 this question),我认为 Hibernate 在构建查询时仍然以 Oracle 为目标。

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

(为后代添加答案)

【讨论】:

    【解决方案2】:

    您在 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 <= ?
    

    【讨论】:

      猜你喜欢
      • 2016-01-08
      • 2020-11-27
      • 1970-01-01
      • 2021-01-31
      • 2016-11-17
      • 2013-06-03
      • 2012-09-28
      • 1970-01-01
      • 2018-04-18
      相关资源
      最近更新 更多