2014-11-03 55 views
1

试图向所有MySQL添加评论在运行时在我的Web应用程序中选择查询。在单个镜头中向所有MySQL Select查询添加列

例如,在代码中的原始查询的样子:

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并在CustomMySQLDialect中添加/*Comment*/

有点困惑要修改哪种方法来完成此操作。希望任何指针在正确的方向。

org.hibernate.dialect.Dialect可以用transformSelectString(java.lang.String)方法重写来完成这个吗?

编辑1: transformSelectString在自定义MySQL的方言是不工作的运行SQL修改

+0

如果你使用的是hibernate,怎么会添加一个列(这大概是hibernate不明白的)对你有帮助? – jtahlborn 2014-11-03 16:18:15

+0

你究竟如何称此“TESTVALUE”?它从何而来?我还没有得到它.. – 2014-11-03 16:22:52

+0

我不能修改原来的查询,但我需要在执行前在查询中添加一个额外的字符串常量。 “TESTVALUE”只是一个字符串常量Leo – 2014-11-03 18:10:57

回答

2

创建自定义DB拦截

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

<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方法。

0

如果你的目标是用一个恒定值增加一列,尝试给它一个别名:

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

我的目标是为应用程序中正在执行的所有选择查询添加一个常量。 – 2014-11-03 18:11:53