问题描述
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>
确保自定义数据库拦截器对sessionFactory没有周期性的依赖关系。通过以上操作,将拦截通过会话工厂触发的所有查询,进行修改,然后将其传递给该onPrepareStatement
方法。
解决方法
尝试在运行时向我的Web应用程序中的所有MySQL Select查询添加注释。
例如,代码中的原始查询如下所示:
select a,b,c from ......
select x,y from...
所有这些都需要 在运行时 修改为:
select a,c /*Comment*/ from ...
select x,y /*Comment*/ from ...
该应用程序在Hibernate
4.2.1上运行。我能想到的唯一解决方案是扩展org.hibernate.dialect.MySQLDialect
并在/*Comment*/
中添加CustomMySQLDialect
。
对于为实现此目的而修改的方法有些困惑。希望任何朝着正确方向的指针。
可以重写transformSelectString(java.lang.String)
in方法org.hibernate.dialect.Dialect
来做到这一点吗?
编辑1:自定义MySQL方言中的transformSelectString不适用于运行时SQL修改