日付ロジックを実行するコードがいくつかあり、アプリケーションで使用する必要がある可能性のあるさまざまなデータベース用のカスタム Hibernate 方言を作成して、方言を設定するだけでデータベースクエリがすべてのデータベースで機能するようにしたいと考えました。
MySQL の場合:
public class ExtendedMySQLDialect extends MySQLDialect {
public ExtendedMySQLDialect() {
super();
SQLFunctionTemplate dateSubDays = new SQLFunctionTemplate(Hibernate.DATE, "DATE_SUB(SYSDATE(),INTERVAL ?1 DAY)");
registerFunction("date_sub_days", dateSubDays);
SQLFunctionTemplate dateSubDaysGreatestFunction = new SQLFunctionTemplate(Hibernate.DATE, "DATE_SUB(SYSDATE(),INTERVAL GREATEST(?1,?2,?3) DAY)");
registerFunction("date_sub_days_greatest", dateSubDaysGreatestFunction);
}
}
これまでのところ、スタンドアロン アプリケーションでは、ダイアレクトを ExtendedMySQLDialect に変更し、トランスレータ ファクトリが 'ASTQueryTranslatorFactory' であることを確認することで、これをうまく実行できます (ClassicQueryTranslatorFactor またはそのようなもの - 「関数 xxx が見つかりません」というエラーが表示されます)。
ここが変なところです。Tomcat の axis2 で配布された、まったく同じ hibernate 構成ファイル、同じバージョンの hibernate、同じバージョンの antlr、および同じバージョンのダイアレクトを使用すると、初めて取得した「FUNCTION mydb.date_sub_days does not exist」エラーが表示されますClassicQueryTranslatorFactory。しかし、Tomcat の起動ログに次のように表示されます。
[INFO] RDBMS: MySQL, version: 5.6.11
[INFO] JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.6 ( Revision: ${svn.Revision} )
[INFO] Using dialect: com.capxd.infra.model.dialects.ExtendedMySQLDialect
[INFO] Transaction strategy: org.hibernate.transaction.JDBCTransactionFactory
[INFO] No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
[INFO] Automatic flush during beforeCompletion(): disabled
[INFO] Automatic session close at end of transaction: disabled
[INFO] JDBC batch size: 15
[INFO] JDBC batch updates for versioned data: disabled
[INFO] Scrollable result sets: enabled
[INFO] JDBC3 getGeneratedKeys(): enabled
[INFO] Connection release mode: auto
[INFO] Default schema: mydb
[INFO] Maximum outer join fetch depth: 2
[INFO] Default batch fetch size: 1
[INFO] Generate SQL with comments: disabled
[INFO] Order SQL updates by primary key: disabled
[INFO] Order SQL inserts for batching: disabled
->> [INFO] Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
[INFO] Using ASTQueryTranslatorFactory
[INFO] Query language substitutions: {}
[INFO] JPA-QL strict compliance: disabled
[INFO] Second-level cache: enabled
[INFO] Query cache: disabled
[INFO] Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory
[INFO] Optimize cache for minimal puts: disabled
[INFO] Structured second-level cache entries: disabled
[INFO] Statistics: disabled
[INFO] Deleted entity synthetic identifier rollback: disabled
[INFO] Default entity-mode: pojo
[INFO] Named query checking : enabled
[INFO] Hibernate Search 3.1.0.GA
[INFO] Hibernate Commons Annotations 3.1.0.GA
[INFO] building session factory
[INFO] Not binding factory to JNDI, no JNDI name configured
なぜこれが私の機能を欠いている可能性があるのか について何か提案はありますか? axis2 の lib フォルダーを確認したところ、antlr-2.7.7 が含まれていたので、それを取り出しました (私のスタンドアロン アプリは 2.7.6 を使用しています) が、違いはないようです。関数が見つからない理由を確認するために確認できることはありますか? Hibernate が関数を登録したかどうかを出力する方法はありますか?
編集!!
結局のところ、私は 2 つの別々のクエリを混同していました。1 つは「クエリ」です。
<query name="recent_orders">
もう 1 つは「SQL クエリ」です。
<sql-query name="delete_orders">
sql-query をクエリに変更すると、Translator がそれを取得できるようになり、動作するようになりました...