您可以尝试在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)"));
}
}
- 现在您可以在 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.