0

hibernate 3.6 を使用していますが、criteria.list の使用に問題があります。"d'eau" や "d´eau" のような引用符やアクセントを含む検索語が必要です。私のコードは次のようなものです:

Criteria criteria;
criteria.add(Restrictions.ilike("nameParam", "d''eau", MatchMode.ANYWHERE));

SQL Server データベースを使用しているため、2 つの一重引用符を付けました。単一引用符は別の単一引用符でエスケープされるため、2 つの単一引用符があります。ステートメントの結果は 0 ですが、SQL サーバー クライアントのログに出力された SQL ステートメントを実行すると、約 120 の結果が得られます。

HQL と同じ SQL ステートメントでテストします。私はこれを得る:

String hqlQuery = "select distinct(t) from Table t where b.idCon in (select t2.idCon from Table t2 where lower(t2.outTerTb) like '%d''eau%')";
List qwer = getEntityManager().createQuery(hqlQuery).getResultList();
System.out.println("qwer.size() -> " + qwer.size());

String hqlQuery2 = "select distinct(t) from Table t where b.idCon in (select t2.idCon from Table t2 where lower(t2.outTerTb) like :param)";
List qwer2 = getEntityManager().createQuery(hqlQuery2).setParameter("param", "%d''eau%").getResultList();
System.out.println("qwer2.size() -> " + qwer2.size());

このコードは以下を出力します:

qwer.size() -> 120
qwer2.size() -> 0

そして、なぜこれが起こるのか理解できません。私の英語が下手ならごめんなさい

4

1 に答える 1

1

パラメータで一重引用符をエスケープする必要はありません。これがパラメータを使用するポイントです (Hibernate および舞台裏の JDBC 準備済みステートメント): JDBC ドライバは、エスケープする必要があるすべてのものをエスケープします。

UI レイヤーから取得したものをそのままパラメーターに詰め込むと、ドライバーによってすべてが適切にエスケープされ、SQL インジェクション攻撃のリスクがなくなります。

于 2012-05-25T09:53:21.770 に答える