hql中的sql存储过程

elcex8rz  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(402)

如何在hql中编写存储过程或函数?有可能吗?我没有找到任何关于它的信息。
问题是,我的应用程序与多个数据库(oracle、mssql、postgresql)协同工作,我需要在查询中计算levenshtein距离。我可以不为每个数据库编写3个本机sql函数和查询就完成它吗?

4ngedf3f

4ngedf3f1#

您可以尝试用hibernate方言封装不同数据库中levenshtein函数名之间的差异。下面我将为oracle和postgresql提供一个示例(我没有使用mssql)
扩展的oracle方言:

public class MyOracleDialect extends Oracle12cDialect
{
   public MyOracleDialect()
   {
      super();
      registerFunction( "levenshtein", new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "UTL_MATCH.EDIT_DISTANCE(?1,?2)" ) );
   }
}

扩展的postgresql方言:

public class MyPostgreSQLDialect extends PostgreSQL95Dialect
{
   public MyPostgreSQLDialect()
   {
      super();
      registerFunction( "levenshtein", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "levenshtein(?1, ?2)"));
   }
}

现在你可以用 levenshtein hql中的函数。

List<Integer> result = session.createQuery(
   "select levenshtein(word1, word2) from TestEntity",
   Integer.class
).getResultList();

p、 对于postgresql,我遇到了以下问题:如果扩展 fuzzystrmatch 已为特定架构安装 TEST_SCHEMA :

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.

相关问题