【问题标题】:Stored procedures in HQLHQL 中的存储过程
【发布时间】:2020-06-22 13:49:53
【问题描述】:

如何在 HQL 中编写存储过程或函数?可能吗?我没有找到任何关于它的信息。

问题是我的应用程序适用于多个数据库(Oracle、MSSQL、PostgreSQL),我需要在查询中计算 Levenshtein 距离。我可以在不为每个数据库编写 3 个原生 SQL 函数和查询的情况下做到这一点吗?

【问题讨论】:

  • 也许this 会有所帮助。
  • 在例子中我们通过hibernate调用MySql过程,但是它可以和其他数据库一起工作吗?我需要为所有数据库编写通用的程序。
  • HQL 不支持存储过程。你认为这会有什么帮助? Levenshtein 在这三个数据库中的实现方式不同

标签: sql hibernate hql


【解决方案1】:

您可以尝试在hibernate方言中封装不同数据库中的Levenshtein函数名称之间的差异。下面我将提供 Oracle 和 PostgreSQL 的示例。 (我没有使用 MSSQL)

  1. 扩展的 Oracle 方言:
public class MyOracleDialect extends Oracle12cDialect
{
   public MyOracleDialect()
   {
      super();
      registerFunction( "levenshtein", new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "UTL_MATCH.EDIT_DISTANCE(?1,?2)" ) );
   }
}
  1. 扩展的 PostgreSQL 方言:
public class MyPostgreSQLDialect extends PostgreSQL95Dialect
{
   public MyPostgreSQLDialect()
   {
      super();
      registerFunction( "levenshtein", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "levenshtein(?1, ?2)"));
   }
}
  1. 现在您可以在 HQL 中使用 levenshtein 函数。
List<Integer> result = session.createQuery(
   "select levenshtein(word1, word2) from TestEntity",
   Integer.class
).getResultList();

P.S. 我遇到了 PostgreSQL 的以下问题: 如果为特定架构 TEST_SCHEMA 安装了扩展 fuzzystrmatch:

SQL> create extension fuzzystrmatch;

那么您应该在连接 url 中指定此架构:

<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/postgres?currentSchema=TEST_SCHEMA</property>

否则你会得到一个异常:

org.postgresql.util.PSQLException: ERROR: function levenshtein(character varying, character varying) does not exist. No function matches the given name and argument types. You might need to add explicit type casts.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2013-11-23
    • 2010-09-15
    • 2017-01-01
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多