2014-11-03 50 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