这里遇到了一个犹豫关于休眠方式以像关键字查询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'关键字的?
原始字符串''%?%''未被识别为包含参数,并且这是正确的行为。你可以放置一个参数而不是一个值绑定,但不能放在一个里面。 – coladict
只是,不要在控制器中创建你的SQL :) – veljkost
@veljkost但我需要getFirst方法中的变量,如果我不在控制器中创建sql,应在哪里创建它? – Crabime