一次性向所有MySQL Select Queries添加一列

时间:2014-11-03 16:09:02

标签: java mysql hibernate dialect

尝试在运行时向我的Web应用程序中的所有MySQL Select Queries添加注释。

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

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

对于要修改哪个方法来完成此操作有点困惑。希望任何指针都朝着正确的方向发展。

可以覆盖transformSelectString(java.lang.String)中的org.hibernate.dialect.Dialect方法来实现此目的吗?

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

2 个答案:

答案 0 :(得分:2)

创建自定义数据库拦截器

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文件中,为会话工厂配置拦截器:

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

确保Custom DB Interceptor对sessionFactory没有循环依赖。 通过上述内容,拦截,修改了通过会话工厂触发的所有查询,然后将其传递给onPrepareStatement方法。

答案 1 :(得分:0)

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

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