hibernate如何处理查询语句

时间:2016-09-27 03:03:03

标签: mysql hibernate

这里遇到了关于hibernate在查询语句中处理喜欢关键字的方式的犹豫。这是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如何处理&#39;喜欢&#39;关键词?

1 个答案:

答案 0 :(得分: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+"%"});