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