2016-09-27 68 views
0

這裏遇到了一個猶豫關於休眠方式以關鍵字查詢sentence.This的買賣DaoImpl一個小片段,看看它是第一:休眠如何處理類似關鍵字查詢語句

public List<T> findBySQL(String sql, String... params){ 
    SQLQuery query = getSession().createSQLQuery(sql); 
    query.addEntity(clazz); 
    for (int i = 0; i < params.length; i++){ 
     query.setParameter(i, params[i]); 
    } 
    List<T> list = query.list(); 
    return list; 
} 

OK!毫無疑問,並用它在下面的控制器:

@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; 
} 

這裏是結果:{"src":"http://p0.meituan.net/350.214/deal/ac8ba922d7a6030325976fb31e51b4ce38985.jpg","resname":"哈哈派"}

,但是當我改變這樣的SQL語句像這樣使用並沒有修改任何東西:

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 

但我不認爲這是參數索引問題,也許有些錯誤或者可能像不能像這樣使用?所以我想知道hibernate是如何處理'like'關鍵字的?

+1

原始字符串''%?%''未被識別爲包含參數,並且這是正確的行爲。你可以放置一個參數而不是一個值綁定,但不能放在一個裏面。 – coladict

+0

只是,不要在控制器中創建你的SQL :) – veljkost

+0

@veljkost但我需要getFirst方法中的變量,如果我不在控制器中創建sql,應在哪裏創建它? – 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

哪個查詢適合您?第一還是第二呢? –

+0

實際上兩者都是一樣的,你可以看到我使用字符串...在DaoImpl中,並且你給出了我在hibernate中正確使用的靈感。 – Crabime

+0

好的,這聽起來不錯。 –