2016-09-27 1 views
0

でのようなキーワードとの契約を休止状態は、クエリsentence.This年代にのようなキーワードでDaoImplの小さなスニペットを扱うHibernateと最初にそれを見る方法についての躊躇に会いました!任意の疑いなしとコントローラの下にそれを使用します。{"src":"http://p0.meituan.net/350.214/deal/ac8ba922d7a6030325976fb31e51b4ce38985.jpg","resname":"哈哈派"}方法ここでは、クエリ文

が、私はのようにして何かを修正せずにを使用して、このようなSQL文を変更します:

ここ

@RequestMapping(value = "/getFirst/{var}", produces = "application/json; charset=utf-8") 
public @ResponseBody Site getFirst(@PathVariable String var){ 

    String fr = "select * from Food f where f.resname = ?"; 
    List<Site> siteList = siteService.findBySQL(fr, var); 
    Site first = siteList.get(0); 
    return first; 
} 

は結果であり、 String fr = "select * from Food f where f.resname like '%?%'"; List<Site> siteList = siteService.findBySQL(fr, var);

再デプロイと実行、例外が表示されます。

HTTP Status 500 - Request processing failed; nested exception is org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1 

しかし、私はそれがパラメータインデックスの問題だとは思わない、多分何かエラーまたはおそらくそのように使用することはできません?だから私はどのように冬眠のような "キーワード"を扱うのだろうか?

+1

生の文字列 ''%%%'はパラメータを含むと認識されず、正しい動作です。値バインディングの代わりにパラメータを配置することはできますが、値バインディングの内部には配置できません。 – coladict

+0

コントローラにSQLを作成しないでください:) – veljkost

+0

@veljkostしかし、コントローラにSQLを作成しないと、getFirstメソッドで変数が必要です。作成する場所はどこですか? – Crabime

答えて

1

パラメータにはwildchar(%)を追加し、クエリは追加しないでください。したがって、以下のようにクエリを変更してください。

String fr = "select * from Food f where f.resname like ? "; 
List<Site> siteList = siteService.findBySQL(fr, "%"+var+"%"); 

OR 

String fr = "select * from Food f where f.resname like ? "; 
List<Site> siteList = siteService.findBySQL(fr, new String[]{"%"+var+"%"}); 
+0

どのクエリがあなたのために働いたのですか?最初または2番目? –

+0

実際にはどちらも同じですが、私はDaoImplで文字列を使用しているのを見ることができます。そして、あなたは私に冬眠のような正しい使い方についてのインスピレーションを与えます。 – Crabime

+0

これはいいですね。 –

関連する問題