【问题标题】:Add a column to all MySQL Select Queries in a single shot一次性向所有 MySQL 选择查询添加一列
【发布时间】:2014-11-03 16:09:01
【问题描述】:

尝试在运行时向我的 Web 应用程序中的所有 MySQL 选择查询添加注释。

例如,代码中的原始查询如下所示:

select a,b,c from ......
select x,y from...

所有这些都需要在运行时修改为:

select a,b,c /*Comment*/ from ...
select x,y /*Comment*/ from ...

应用程序在 Hibernate 4.2.1 上运行。 我能想到的唯一解决方案是扩展org.hibernate.dialect.MySQLDialect 并将/*Comment*/ 添加到新的CustomMySQLDialect 中。

对修改哪种方法来完成此操作有点困惑。将不胜感激任何指向正确方向的指针。

可以覆盖org.hibernate.dialect.Dialect 中的transformSelectString(java.lang.String) 方法来完成此操作吗?

编辑 1: 自定义 MySQL 方言中的 transformSelectString 不适用于运行时 SQL 修改

【问题讨论】:

  • 如果您使用的是hibernate,那么添加一个列(这可能是hibernate不理解的)对您有什么帮助?
  • 您如何称呼这个“TESTVALUE”?它从何而来?我还没收到呢。。
  • 我无法修改原始查询,但我需要在执行前在查询中添加一个额外的字符串常量。 "TESTVALUE" 只是一个字符串常量 Leo
  • 我不需要休眠来理解或映射列。只需要在执行前向查询传递一个值。
  • 你为什么要这样做?你想解决什么问题?

标签: java mysql hibernate dialect


【解决方案1】:

创建自定义数据库拦截器

package com.felix.dao.interceptor;
import org.hibernate.EmptyInterceptor;

public class CustomDBInterceptor extends EmptyInterceptor {

  @Override
  public String onPrepareStatement(String sql) {
    String commentStr = "/*Comment*/"
    return super.onPrepareStatement(commentStr+sql);
  }

}

在 Spring Context 文件中,为会话工厂配置 Interceptor:

<bean id="customDBInterceptor" class="com.felix.dao.interceptor.CustomDBInterceptor"/>
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="datasource" />
    <property name="entityInterceptor">
        <ref bean="customDBInterceptor"/>
    </property>
    ...
</bean>

确保自定义 DB 拦截器没有对 sessionFactory 的循环依赖。 使用上述方法,所有通过会话工厂触发的查询都会被拦截、修改,然后传递给onPrepareStatement 方法。

【讨论】:

    【解决方案2】:

    如果您的目标是添加一个具有常量值的额外列,请尝试给它一个别名:

    SELECT a, b, c, "TESTVALUE" AS `new_column` FROM ...
    

    【讨论】:

    • 我的目标是为应用程序中正在执行的所有选择查询添加一个常量。
    猜你喜欢
    • 1970-01-01
    • 2014-07-21
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多