2009-03-09 4 views
56

Restrictions.ilike( 'property'、 '%value%')を見ましたが、lower(property)= 'value'のようなSQLを生成したいとします。何か案は?Hibernateを使用した大文字と小文字を区別しない同等条件

は、私が使用:

Restrictions.eq("email", email).ignoreCase() 

式は廃止されているので。 SimpleExpressionは値に対してLowerCase()を呼び出しますので、あらかじめ行う必要はありません。

参照:SimpleExpression source

答えて

65

ilikeを使用することに注意してください。誰かが "test%"のようなものを入力して一致するようにするためです。 1つのアプリで大文字と小文字を区別しない等価処理を行うには、次のようにします:

... 
Criteria crit=session.createCriteria(Event.class); 
crit.add(Expression.eq("rsvpCode","test1").ignoreCase()); 
... 
+9

バージョン4のアップデートは今では廃止されましたか? – NimChimpsky

+7

代わりに制限を使用してください(下の私の答えを参照してください) –

7

が、私は絶対にわからないんだけど、あなたはRestriction.eqを使用するときにSimpleExpressionオブジェクトを取得し、そのオブジェクトが、私が使ってみたことがありませんignoreCaseは()操作をsuppportsが、のように聞こえますそれは違いを生むかもしれない。

このメソッドが実際に何を行っているのかを文書化していないことを推測してください。

+0

注意深いウリ、ギャビンキング、クリスチャンベアが見守っているかもしれません... 8)Hibernateのフォーラムで批判的なことが少しありがちです。 – duffymo

+0

私は私の博士号をやっています。 JavaDocsの使いやすさと正確性に関する研究...その方法でJavaDocsを完全に省略すると私の仕事は消えていきます; – Uri

67

表現は現在廃止予定です。代わりに制限を使用してください...

crit(Restrictions.eq("firstName", firstName).ignoreCase()); 
+0

プロパティがenum型の場合、これは動作しません。内部的に休止状態にすると、列挙型に対して実際には失敗する列にlower()が適用されます。あなたはこれに対する解決策を知っていますか? – akhi

+0

mysqlデータベースを使用している場合、ignorecaseは、データベースに対して実際に実行されたSQLの中でlowerを使用します。 mysqlでは "より低い"インデックスを作成することはできません(他のデータベースでも可能ですが)。これは、カラムにあるインデックス(この場合は "firstName")を利用しないことを意味します。 –

+0

文字列ではない文字を比較する際に問題がありますが、ignoreCaseがこれで動作することが期待されます。 – borjab

0

crit(Restrictions.eq("firstName", firstName).ignoreCase());作品です。

これはSimpleExpression Objectを返しますが、lower(firstname)というクエリを生成します。これはうまくいく。

+0

ここで質問/回答の詳細については、こちらを参照してください。http://stackoverflow.com/aboutあなたの投稿は質問に答えていません。それはもっと評判です。一度追加すると評判が上がります:http://stackoverflow.com/faq#reputation –

10

アンディの答えは、大文字と小文字を区別しない検索のため、このことを示唆しているが、また、バージョン4.1を休止して動作しますと:

crit(Restrictions.eq("firstName", firstName).ignoreCase()); 

バージョン4.1.1以降にHibernateのはignoreCase()をサポートしていません。方法はRestriction.eq()です。そのためには、ilikeMatchModeを使用する必要があります。例として

Criteria crit = session.createCriteria(ENTITY.class); 
crit.add(Restrictions.ilike('PROPERTY NAME', 'VALUE', MatchMode.ANYWHERE)); 

ID、名前、姓特性を有するUSERエンティティの名前に基づいて、大文字と小文字を区別しない検索は次のようになります

Criteria crit = session.createCriteria(USER.class); 
crit.add(Restrictions.ilike('name', 'Satyam', MatchMode.ANYWHERE)); 

これは、すべての結果を返します、 大文字小文字を区別しません。

+2

なぜ彼らはもうサポートしていませんか? –

関連する問題