mysql単一フィールド任意の文字マッチングブラークエリ
1629 ワード
問題の説明
文字列String str=「高輝度」(フロントから伝達され、動的に変化する文字列)を与えます.ユーザー・テーブルのユーザー名に、上記の文字列の任意の文字が含まれているすべてのユーザー情報を検出します.
可能な考え方誤った考え方1:3文字を同時に含むユーザー名のみがクエリーされます. 誤った考え方2:文法が間違っていて、「高」を含むユーザー名しか検索できません. 誤った考え方3:結果は正しい.ダイナミックパラメータ、接合sqlは難易度が高い. 誤った考え方3:動的パラメータ、接合sqlは難易度が高い. 誤った考え方4:クエリー結果が空で、原因:mysql内部には自分のルールがある.「like」を「rlike」または「REGEXP」に置き換えることも考えられます.しかし、hibernateではこの方法はサポートされていません.また、クエリの結果はまだ間違っています(原因はよくわかりません).
正しい方法をテスト hibernateではsql文方式を使用すればよいが、hqlは使用せず、サポートされていない.概ね以下の である.
文字列String str=「高輝度」(フロントから伝達され、動的に変化する文字列)を与えます.ユーザー・テーブルのユーザー名に、上記の文字列の任意の文字が含まれているすべてのユーザー情報を検出します.
可能な考え方
select * from user where userName like ‘% % % %’;
select * from user where userName like ‘% %’ or '% %' or '% %';
select * from user where userName like ‘% %’ or userName like '% %' or userName like '% %';
select * from user where userName like ‘% %’ or userName like '% %' or userName like '% %';
select * from user where userName like ‘%[ ]%’;
正しい方法をテスト
select * from user where userName REGEXP ‘ | | ’;
Query query = getSession().createSQLQuery("select * from UsersInfor where userName REGEXP ?");
// HQL
// Query query = getSession().createQuery("from " +
// UsersInfor.class.getSimpleName() + " where userName REGEXP ?");
query.setParameter(0, word);
query.setFirstResult(Contants.Pager.pagerSize * (page - 1));//
query.setMaxResults(Contants.Pager.pagerSize);//
if (query.list() != null && !query.list().isEmpty()) {
return query.list();
} else {
return null;
}