Hibernate HQL(およびHibernateがプロバイダーである限りJPQL)では、任意のタイプのデータベース固有の関数を確実に使用できます。これらの機能についてHibernateに伝える必要があります。3.3では、そのための唯一のオプションは、カスタムダイアレクトを提供し、ダイアレクトのコンストラクターから関数を登録することです。基本の方言クラスを見ると、関数の登録の例がたくさんあります。通常、現在使用している正確な方言を拡張し、拡張機能を提供するのが最善です(ここでは、関数を登録します)。
興味深いことに、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 ) +
")";
}
}
);
}
}