使用LIKE查询在文本中使用单引号的Ormlite异常

时间:2013-07-12 06:02:34

标签: ormlite query-builder

我有一个似乎是个错误的东西。我可以在数据库中添加一个条目,该条目在文本中有一个引号。

但是,当我使用QueryBuilder进行搜索时,对于任何文本LIKE xyz,如果xyz中有单引号,我会让MySQL抱怨格式错误的SQL。

除了自己解析所有字符串外,Ormlite中是否有一些方法可以调用“santize”我的字符串?

示例代码如下:

public boolean isDuplicate () {
  QueryBuilder<Company, Long> qb = getDao().queryBuilder() ;
  Where<Company, Long> where = qb.where() ;
     try {
       if (Strings.isValid(name))
           where.like("name", name) ;

        if (Strings.isValid(regNo)) {
           if (Strings.isValid(name))
              where.or() ;

           where.eq("regNo", regNo) ;

           List<Company> res = where.query() ;
           if (res != null && res.size() > 0)
              return true ;
           else
              return false ;
        }
     } catch (SQLException e) {
        GlobalConfig.log(e, true);
     }
     return false ;
  }

如果公司名称中包含单引号,则会产生SQL错误:

  

创建默认条目Well Do not Delete Me 2 Please Pte Ltd.    [12-07-2013 13:45:42]你的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在“t Delete Me 2 Please Pte Ltd.”附近使用正确的语法。或regNo ='删除')'第1行

欢迎任何建议。

1 个答案:

答案 0 :(得分:1)

好的,我想出来了 - 我需要使用SelectArg查询数据库的方法。

所以它现在看起来像这样:

  ...
  if (Strings.isValid(name))
     {
     SelectArg arg = new SelectArg () ;   // Added
     arg.setValue (name) ;                / Added
     where.like("name", arg) ;    // Changed
     }

    if (Strings.isValid(regNo))
       {
       if (Strings.isValid(name))
          where.or() ;

       SelectArg arg = new SelectArg () ;     // Added
       arg.setValue (regNo) ;                 // Added
       where.eq("regNo", arg) ;               // Changed

       List<Company> res = where.query() ;

       if (res != null && res.size() > 0)
          return true ;
       else
          return false ;
       ...

我所学到的是:你必须使用一个SelectArg PER项目。


现在我对Gray的问题是为什么不将它作为默认行为?当我插入或更新时,它似乎自动发生,并且为了解决我发现的问题,我必须添加更多 代码行很容易成为内部查询处理的一部分。

我理解他在this post中的担忧,但我同意戴尔的观点。也许中途的房子是有一个标志,说明Ormlite应该将参数处理为查询方法。

我很欣赏Ormlite中“可编程”SQL的灵活性和简单性,几乎在所有情况下,Ormlite相关代码都简洁,易于理解和遵循逻辑。这是一个罕见的情况,我觉得它比必要的更冗长,没有净收益。只是我的意见。