私はJava appをOracleデータベースにORMで使用しています(データベースベンダーは重要ではありません。別のデータベースにいつか切り替えるかもしれません)から、オブジェクトを取得したいです。たとえば、ユーザーを検索するときに、ユーザーが「fran」に住んでいる人を探している場合、私はサンフランシスコで彼女の人を提供できるようにしたいと思います。
SQLは私の強力なスーツではありません。HibernateのCriteria
ビルドコードは、そのままハードコードされた文字列よりも好みます。コードでこれを行う方法、そして不可能な場合はハードコードされたSQLがどのように見えるべきかについて、誰かが正しい方向に私を指すことができますか?
おかげで、
ユバル= 8-)
説明する単純なケースについては、大文字と小文字を区別しない検索を行うRestrictions.ilike()を参照してください。
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', '%fran%');
List results = crit.list();
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE);
List results = crit.list();
SpringのHibernateTemplateを使用してHibernateと対話する場合、ユーザーのメールアドレスで大文字と小文字を区別しない検索を行う方法は次のとおりです。
getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());
大文字小文字を無視する通常のアプローチは、データベース値と入力値の両方を大文字または小文字に変換することです-結果のSQLは次のようなものになります
select f.name from f where TO_UPPER(f.name) like '%FRAN%'
休止状態の基準でrestriction.like(...)。ignoreCase()
私はNhibernateに精通しているので、構文は100%正確ではないかもしれません
詳細については pro hibernate 3 extract および hibernate docs 15.2。結果セットの絞り込み をご覧ください。
また、「%」ワイルドカードを入れる必要もありません。 MatchMode ( 以前のリリースのドキュメントはこちら )を渡して、検索の動作を指示できます。 START
、ANYWHERE
、EXACT
、およびEND
の一致はオプションです。
ほとんどの既定のデータベース照合では大文字と小文字は区別されませんが、SQL Serverの世界では、インスタンス、データベース、列レベルで設定できます。
Luceneの上のラッパーのCompassの使用を見ることができます。
http://www.compass-project.org/
ドメインオブジェクトにいくつかの注釈を追加することで、このようなことを実現できます。
コンパスは、Luceneを操作するためのシンプルなAPIを提供します。 ORMの使用方法を知っている場合は、クエリの保存と削除の簡単な操作でCompassを使用できます。
サイト自体から。 「コンパスはLuceneの上に構築され、Googleスタイルの検索、インデックスの更新、キャッシングやインデックスシャーディング(サブインデックス)などのより高度な概念など、Luceneの一般的な使用パターンを簡素化します。マージします。」
私は過去にこれを使用しましたが、素晴らしいと思います。
これは、org.hibernate.criterionパッケージの基準Exampleを使用して行うこともできます。
public List findLike(Object entity, MatchMode matchMode) {
Example example = Example.create(entity);
example.enableLike(matchMode);
example.ignoreCase();
return getSession().createCriteria(entity.getClass()).add(
example).list();
}
上記を達成するのに役立つと私が思うもう一つの方法。