java - 从 Oracle Db 切换到 MySQL。命名查询不再有效

标签 java mysql hibernate

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

@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 Error: 1248, SQLState: 42000

2013-04-24 10:46:00,677 ERROR [org.hibernate.util.JDBCExceptionReporter] (http-127.0.0.1-8080-1) Every derived table must have its own alias

生成的 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不需要它?

hibernate 部分配置:

<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"/>

最佳答案

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

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

(为后代添加答案)

关于java - 从 Oracle Db 切换到 MySQL。命名查询不再有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16198320/

相关文章:

mysql - 如何管理非常大的 MySql 数据库

php - 为带有 TICKED 复选框的行运行 UPDATE 语句

java - 对文件中的数组进行排序并打印结果

java - 如何将命令行参数包含 "|"传递给 java 程序

mysql - 查找第一次出现的连续开始/结束列

java - 如何使用 View 和过滤器避免 hibernate 中的嵌套查询

Java Hibernate javax.persistence.Transient 关于反射的注解

java - 插入场景中按版本划分的 JPA/Hibernate 乐观锁

java - Button.setEnabled() 导致 EdiTtext 崩溃

java - 是否可以使用 E4 以编程方式更改 Activity 工作区?