2010-12-02 20 views
4

私は正規表現である文字列のリストを受け付けるWebサービスを実装しようとしています。これらはデータベースの6列と比較する必要があり、一致する行はすべて返す必要があります。 Hibernate/Oracleでの正規表現の使い方

私はOracleは、私が使用することができるかもしれないREGEXP_LIKE()関数を持っていると信じていますが、私は、Hibernateを使用してこれを行うための 最善方法を探していますので、私は永続化エンジン不利に働いていませんよ。

私は、参加者のコレクションは、正規表現が含まれているこのような何か、で開始:

List<Message> messages = new ArrayList<Message>(); 
List<Message> m1 = ((Session) entityManager.getDelegate()) 
    .createCriteria(MessageSSR.class).add(Restrictions.or(
      Restrictions.in("Node2Id", participants), 
      Restrictions.in("Node2Id", participants))).list(); 
List<Message> m2 = ((Session) entityManager.getDelegate()) 
    .createCriteria(MessageSSR.class).add(Restrictions.or(
      Restrictions.in("Node3Id", participants), 
      Restrictions.in("Node4Id", participants))).list(); 
List<Message> m3 = ((Session) entityManager.getDelegate()) 
    .createCriteria(MessageSSR.class).add(Restrictions.or(
      Restrictions.in("Node5Id", participants), 
      Restrictions.in("Node6Id", participants))).list(); 
messages.addAll(m1); 
messages.addAll(m2); 
messages.addAll(m3); 

「に」私がやりたいことはありませんので、これは動作しません、これは表示されません。 Hibernateに正規表現マッチを使用するよう指示します。

これは私が作ってみた唯一の答えですが、それは本当に醜い:

List<Message> messages = new ArrayList<Message>(); 
for (String re : participants) { 
    List<Message> m1 = ((Session) entityManager.getDelegate()) 
     .createCriteria(MessageSSR.class) 
     .add(Restrictions.or(
       Restrictions.sqlRestriction("regexp_like(NODE_1, " + re + ")"), 
       Restrictions.sqlRestriction("regexp_like(NODE_2, " + re + ")") 
     )).list(); 
    List<Message> m2 = ((Session) entityManager.getDelegate()) 
     .createCriteria(MessageSSR.class) 
     .add(Restrictions.or(
       Restrictions.sqlRestriction("regexp_like(NODE_3, " + re + ")"), 
       Restrictions.sqlRestriction("regexp_like(NODE_4, " + re + ")") 
     )).list(); 
    List<Message> m3 = ((Session) entityManager.getDelegate()) 
     .createCriteria(MessageSSR.class) 
     .add(Restrictions.or(
       Restrictions.sqlRestriction("regexp_like(NODE_5, " + re + ")"), 
       Restrictions.sqlRestriction("regexp_like(NODE_6, " + re + ")") 
     )).list(); 
    messages.addAll(m1); 
    messages.addAll(m2); 
    messages.addAll(m3); 
} 

私は私ができるとしてOracleへの上にこれの限りをプッシュしようとしています。このアプラックはうまくいくと思われますが、パラメータを使用せずに制限を加えることは、潜在的な効率をほとんど失うことを意味します。誰もこれを行うためのより良い方法を見ることができますか?簡単にするために、私は正規表現が私に渡されていると信じています。

答えて

7

(HQLクエリまたはCriteriaクエリを使用して)正規表現クエリを実行するためのhibernateドキュメントには何もありません。 sqlRestrictionsを使用するアプローチは、SQLインジェクションの脆弱性を回避するために、おそらくオーバーロードされた方法の1つに変更する必要があります。 \\と:アルファ:Oracleがオーバーライド以来提供してオペレータに動作するように見えたことはありません

コード例:あなたが使用する必要がある場合

Restrictions.sqlRestriction("regexp_like({alias}.NODE_1, ?)", re, Hibernate.STRING) 
+0

は素晴らしい作品。 –

0

同様の作業例

Criterion criterion = Restrictions.sqlRestriction("regexp_like (column_name, ?, 'i')", "(^|\\s)"+searchValue+"($|\\s|.$)", StringType.INSTANCE);