java - 自定义 SQL 函数在 Tomcat 的 axis2 内部不起作用

标签 java sql hibernate tomcat apache-axis

我有一些执行某些日期逻辑的代码,并且想为我们可能需要与我们的应用程序一起使用的各种数据库创建自定义 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”)。

这就是奇怪的地方。使用完全相同的 hibernate 配置文件、相同版本的 hibernate、相同版本的 antlr 和相同版本的方言,在 Tomcat 的 axis2 下部署,我得到了我第一次得到的“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 更改为查询允许翻译器选择它,现在它可以工作了......

最佳答案

翻译器不适用于标记为“sql-query”的命名查询,仅适用于标记为“query”的命名查询。语法略有不同,但可以使用自定义方言函数。

关于java - 自定义 SQL 函数在 Tomcat 的 axis2 内部不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19859529/

相关文章:

java - Spring-boot JPA 实体 OneToOne 添加与父级相关的新子级

java - Java获取域名的相关部分

java - 将 stringWidth 与 html 字符串一起使用

mysql - 在 DataGrid VB.Net 中搜索(过滤器)

sql - 如何在 Postgresql 函数中使用临时序列

Hibernate - 如何使关联渴望(全局)?

java - JPA:em.flush() 之后的 em.clear() 会改变事务语义吗?

java - 如何将此 MD5 编码 PHP 转换为 java

java - 当一个实例的成员暴露给外界时,它能被垃圾回收吗

php - 为 PHP 表单插入查询