2016-09-27 33 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

好的,这听起来不错。 –