50

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

CriteriaSQL は私の得意分野ではありません。ハードコードされた文字列をそのまま使用するよりも、Hibernate の構築コードの方が好きです。誰かがコードでこれを行う方法について正しい方向に向けることができますか?それが不可能な場合、ハードコードされた SQL はどのように見えるべきですか?

ありがとう、

ユヴァル=8-)

4

9 に答える 9

72

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

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', '%fran%');
List results = crit.list();
于 2008-09-23T12:26:16.180 に答える
38
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE);
List results = crit.list();
于 2008-11-14T14:00:21.187 に答える
9

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

getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());
于 2008-10-22T19:30:46.757 に答える
4

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

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

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

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

詳細については、pro hibernate 3 extractおよびhibernate docs 15.2 を参照してください。結果セットの絞り込み

于 2008-09-23T12:22:00.667 に答える
4

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

于 2008-09-23T14:36:36.227 に答える
1

これは、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つの方法。

于 2010-11-03T17:37:17.107 に答える
1

Hibernate 5.2session.createCriteriaは廃止されたため。以下は、JPA 2 CriteriaBuilder を使用したソリューションです。とを使用likeupperます。

    CriteriaBuilder builder = session.getCriteriaBuilder();
    CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
    Root<Person> root = criteria.from(Person.class);

    Expression<String> upper = builder.upper(root.get("town"));
    criteria.where(builder.like(upper, "%FRAN%"));

    session.createQuery(criteria.select(root)).getResultList();
于 2019-09-19T18:59:34.337 に答える
0

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

于 2008-09-23T12:17:35.500 に答える
0

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

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

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

Compass は、Lucene を操作するための単純な API を提供します。ORM の使用方法を知っている場合は、保存、削除、およびクエリの簡単な操作で Compass に慣れることができます。

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

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

于 2008-09-23T12:18:32.783 に答える