web-dev-qa-db-ja.com

Hibernateを使用した大文字と小文字を区別しない検索

私はJava appをOracleデータベースにORMで使用しています(データベースベンダーは重要ではありません。別のデータベースにいつか切り替えるかもしれません)から、オブジェクトを取得したいです。たとえば、ユーザーを検索するときに、ユーザーが「fran」に住んでいる人を探している場合、私はサンフランシスコで彼女の人を提供できるようにしたいと思います。

SQLは私の強力なスーツではありません。HibernateのCriteriaビルドコードは、そのままハードコードされた文字列よりも好みます。コードでこれを行う方法、そして不可能な場合はハードコードされたSQLがどのように見えるべきかについて、誰かが正しい方向に私を指すことができますか?

おかげで、

ユバル= 8-)

48
Yuval

説明する単純なケースについては、大文字と小文字を区別しない検索を行うRestrictions.ilike()を参照してください。

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', '%fran%');
List results = crit.list();
71
Cowan
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE);
List results = crit.list();
37
vasile

SpringのHibernateTemplateを使用してHibernateと対話する場合、ユーザーのメールアドレスで大文字と小文字を区別しない検索を行う方法は次のとおりです。

getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());
9
SamS

大文字小文字を無視する通常のアプローチは、データベース値と入力値の両方を大文字または小文字に変換することです-結果の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。結果セットの絞り込み をご覧ください。

4
Richard

また、「%」ワイルドカードを入れる必要もありません。 MatchMode以前のリリースのドキュメントはこちら )を渡して、検索の動作を指示できます。 STARTANYWHEREEXACT、およびENDの一致はオプションです。

4
Arthur Thomas

ほとんどの既定のデータベース照合では大文字と小文字は区別されませんが、SQL Serverの世界では、インスタンス、データベース、列レベルで設定できます。

0
Cade Roux

Luceneの上のラッパーのCompassの使用を見ることができます。

http://www.compass-project.org/

ドメインオブジェクトにいくつかの注釈を追加することで、このようなことを実現できます。

コンパスは、Luceneを操作するためのシンプルなAPIを提供します。 ORMの使用方法を知っている場合は、クエリの保存と削除の簡単な操作でCompassを使用できます。

サイト自体から。 「コンパスはLuceneの上に構築され、Googleスタイルの検索、インデックスの更新、キャッシングやインデックスシャーディング(サブインデックス)などのより高度な概念など、Luceneの一般的な使用パターンを簡素化します。マージします。」

私は過去にこれを使用しましたが、素晴らしいと思います。

0
Paul Whelan

これは、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();
}

上記を達成するのに役立つと私が思うもう一つの方法。

0
Casey