当前位置: 首页 > 知识库问答 >
问题:

从Oracle数据库切换到MySQL。命名查询不再有效

蓟俊杰
2023-03-14

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

@NamedQuery(name=“get_capability”,query=“从capability cb中选择cb,其中cb.financial_Id=:fiId”)

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

Query=em.createNamedQuery("get_capability");

...

查询setParameter(“fiId”,fiId);

查询setMaxResults(1);

cabability=(能力)查询。getSingleResult();

最后一行抛出一个异常:

2013-04-24 10:46:00,677org.hibernate.util.超文本传输协议-127.0.0.1-8080-1)SQL错误: 1248, SQLState: 42000

2013-04-24 10:46:00,677ERROR[org.hibernate.util.JDBCExceptionReport](超文本传输协议-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不需要别名?

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

共有2个答案

匡翰
2023-03-14

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 <= ?
羊舌赞
2023-03-14

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

确认您已更改为相应的Hibernate方言。

(为子孙后代添加的答案)

 类似资料:
  • 我试图使用下面的MySQL语句

  • 我在AWS Lambda函数中查询MySQL数据库(从AWS远程托管)时遇到问题。 这是我的代码,除了Lambda函数的其余部分(为Alexa技能调用)所需的部分: 当我在命令提示符下用node运行它时,它工作得很好: 我正在使用通过npm安装在index.js目录中的“mysql”模块,并将其压缩和上传到我的Lambda函数中。 同样,这在我的开发机器上有效,但在测试我的Lambda函数时没有说

  • 简介 在 Swoft 2.0.2 版本之前,连接池中没有数据库切换功能,这导致了不同数据库需要配置多个连接池,大大增加了维护成本。所以在 2.0.2 开始新增了切换数据库功能。你可以在链式操作中使用 db() 方法进行指定,这显然不够灵活难以维护,下面推荐一个根据上下文切换数据的操作。 Swoft 版本需 >= 2.0.2 DbSelector 实现 使用 DbSelector 需实现 Swoft

  • 问题内容: 我的代码有问题。 像这样的情况: 我有一个下拉列表,如果选择“个人”,则会出现新的下拉列表,其中包含从数据库查询中检索到的数据;如果选择“公开”,则该下拉列表将消失。 这样的HTML代码: 查询如下: 像这样的JavaScript代码: 我不知道如何将值/结果发送到javascript代码(选择选项中的值和名称)。 问题答案: 在javascript中,您必须对您的php文件进行操作:

  • 问题内容: 这个问题已经在这里有了答案 : 如何快速重命名MySQL数据库(更改架构名称)? (47个答案) 5年前关闭。 我创建了一个名为的数据库。现在,我需要将数据库名称更改为。但是,它在MySQL工作台中被禁用。我可以在Linux服务器本身上执行此操作吗? 问题答案: 我认为您无法做到这一点。我认为您需要转储该数据库,创建新命名的数据库,然后导入转储。 如果这是一个实时系统,则需要将其删除。

  • 本文向大家介绍Oracle 数据库特殊查询总结,包括了Oracle 数据库特殊查询总结的使用技巧和注意事项,需要的朋友参考一下 1. 查询本节点及本节点以下的所有节点: 2. 查询节点中所有的层级关系 3. 对数据库表结构的操作 4. 其他查询 6. loop 的使用 7. 存储过程的书写 以上所述是小编给大家介绍的Oracle 数据库特殊查询总结,希望对大家有所帮助!