1

尝试在运行时向我的 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.

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

可以重写transformSelectString(java.lang.String)方法来完成此操作吗?org.hibernate.dialect.Dialect

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

4

2 回答 2

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

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

于 2014-11-16T13:24:50.433 回答
0

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

SELECT a, b, c, "TESTVALUE" AS `new_column` FROM ...
于 2014-11-03T16:28:04.033 回答