您绝对可以通过 Hibernate HQL(和 JPQL,只要 Hibernate 是提供者)使用您希望使用的任何类型的数据库特定功能。你只需要告诉 Hibernate 这些函数。在 3.3 中,唯一的选择是提供自定义方言并从方言的构造函数中注册函数。如果你看一下基本的 Dialect 类,你会看到很多注册函数的例子。通常最好扩展您当前使用的确切方言并简单地提供您的扩展(这里,注册函数)。
一个有趣的说明是 Oracle 没有将 regexp_like 归类为函数。他们将其归类为条件/谓词。我认为这主要是因为 Oracle SQL 没有定义 BOOLEAN 数据类型,即使他们的 PL/SQL 定义了,我敢打赌 regexp_like 被定义为返回 BOOLEAN 的 PL/SQL 函数......
假设您当前使用 Oracle10gDialect,您将执行以下操作:
public class MyOracle10gDialect extends Oracle10gDialect {
public Oracle10gDialect() {
super();
registerFunction(
"regexp_like",
new StandardSQLFunction( "regexp_like", StandardBasicTypes.BOOLEAN )
);
}
}
我不记得 HQL 解析器是否喜欢返回布尔值的函数,但是就其本身作为谓词而言。您可能不得不将 true/false 转换为其他内容并检查该返回:
public class MyOracle10gDialect extends Oracle10gDialect {
public Oracle10gDialect() {
super();
registerFunction(
"regexp_like",
new StandardSQLFunction( "regexp_like", StandardBasicTypes.INTEGER ) {
@Override
public String render(
Type firstArgumentType,
List arguments,
SessionFactoryImplementor factory) {
return "some_conversion_from_boolean_to_int(" +
super.render( firstArgumentType, arguments, factory ) +
")";
}
}
);
}
}