イントロ
私には奇妙な仕事があります-HibernateCriteriaAPI(つまりデータベースに依存しないスタイル)で書くには、次のようなSQLクエリがあります
select * from branch b where '2/5/3/' like b.hier_path + '%'
+
連結演算子はどこにありますか。連結演算子は、MSSQLのデータベースに依存する'+'、'||' Oracleなどで。
Criteria APIを使用する必要があります(HQLに切り替える方法はありません)。
問題#1-演算子のような
残念ながら、HibernateではJavaオブジェクトのプロパティに基づいてCriteriaのみを書き込むことができます。
pCriteria.createCriteria(Branch.class).add(Restrictions.like("hierarchyPath", "2/5/3/%"));
これは
select * from branch where 'hier_path like 2/5/3/%'
like演算子のオペランドを入れ替える方法がわかりません。
問題#2-データベースに依存しない連結
SQLコードは、Oracle、MS SQL Server、DB2、Postgres、Sybase、MySQL、HSQLDB、Firebird(およびその他の新しいリレーショナルデータベース)で機能する必要があります。
私が今持っているのはSQLベースのハックです:
Restrictions.sqlRestriction("? like concat({alias}.hier_path,'%')", "2/5/3/", Hibernate.STRING)
残念ながら、上記のデータベース(PostgresとFirebirdを除く)のほとんどに存在するデータベース依存concat
関数です。このアプローチは回避策であり、一定の解決策として使用することはできません(カスタム関数を持たないデータベースに追加しようとします)。concat
結論
誰かが私のハック(データベースに依存しないSQL)の改善または元のCriteriaAPIの修正を提案できますか?
更新28.09.12
concat
関数はPostgres9.1に表示されます