質問

Java アプリの Oracle データベースへの ORM に Hibernate を使用しています (データベース ベンダーは重要ではありません。いつか別のデータベースに切り替える可能性があります)。ユーザーが指定した文字列に従ってデータベースからオブジェクトを取得したいと考えています。たとえば、人を検索するときに、ユーザーが「フラン」に住んでいる人を探している場合、サンフランシスコに住んでいる人を指定できるようにしたいと考えています。

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());

また、ワイルドカード「%」を入力する必要もありません。合格できます マッチモード (以前のリリースのドキュメントはこちら) を入力して、検索にどのように動作するかを指示します。 START, ANYWHERE, EXACT, 、 そして END マッチはオプションです。

大文字と小文字を無視する通常のアプローチは、データベース値と入力値の両方を大文字または小文字に変換することです。結果の SQL は次のようになります。

select f.name from f where TO_UPPER(f.name) like '%FRAN%'

休止状態の基準では、restrictions.like(...).ignoreCase()

私は Nhibernate に慣れているため、構文が 100% 正確ではない可能性があります。

詳細については、を参照してください プロ休止状態 3 抽出 そして 休止状態ドキュメント 15.2。結果セットの絞り込み

デフォルトのデータベース照合順序のほとんどは大文字と小文字を区別しませんが、SQL Server の世界ではインスタンス、データベース、列レベルで設定できます。

lucene の上のラッパーである Compass を使用することを検討できます。

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

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

Compass は、Lucene を操作するためのシンプルな API を提供します。ORM の使用方法を知っていれば、保存、削除、クエリなどの簡単な操作で Compass を使いこなすことができるでしょう。

サイト自体から。「Lucene 上に構築された Compass は、Google スタイルの検索、インデックス更新などの Lucene の一般的な使用パターンを簡素化するだけでなく、キャッシュやインデックス シャーディング (サブ インデックス) などのより高度な概念も簡素化します。Compass は同時コミットとマージに対して組み込みの最適化も使用します。」

以前にこれを使用したことがありますが、素晴らしいと思います。

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

上記の目的を達成するために役立つと思われるもう 1 つの方法です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top