1

実行時に 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追加することです。/*Comment*/CustomMySQLDialect

これを達成するためにどのメソッドを変更するかについて少し混乱しています。正しい方向へのポインタをいただければ幸いです。

transformSelectString(java.lang.String)これを達成するためにメソッドをorg.hibernate.dialect.Dialectオーバーライドできますか?

編集 1: カスタム MySQL ダイアレクトの transformSelectString が実行時の SQL 変更に対して機能しない

4

2 に答える 2

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>

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 に答える