我有一些代码可以执行一些日期逻辑,并且想为我们可能需要与我们的应用程序一起使用的各种数据库创建自定义 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')。
这就是它变得奇怪的地方。使用完全相同的休眠配置文件、相同版本的休眠、相同版本的 antlr 和相同版本的方言,在 Tomcat 的轴 2 下部署,我得到第一次遇到的“FUNCTION mydb.date_sub_days 不存在”错误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 是否注册了我的功能?
编辑!!
事实证明,我混淆了两个单独的查询。一个是“查询”:
<query name="recent_orders">
另一个是'sql-query':
<sql-query name="delete_orders">
将 sql-query 更改为查询允许 Translator 拾取它,现在它可以工作了......