0

我有什么似乎是一个错误。我可以向数据库中添加一个条目,该条目在文本中有一个单引号。

但是,当我使用 QueryBuilder 搜索任何文本 LIKE xyz 时,如果 xyz 中有一个单引号,我得到 MySQL 抱怨 SQL 格式错误。

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

示例代码如下:

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 Don't Delete Me 2 Please Pte Ltd. 创建默认条目 [12-07-2013 13:45:42] 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在“t Delete Me 2 Please Pte Ltd.”附近使用的正确语法。OR regNo= 'delete' )' 在第 1 行

欢迎任何建议。

4

1 回答 1

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 的问题是,为什么不将其设为默认行为?当我插入或更新时,它似乎是自动发生的,为了解决我发现的问题,我必须添加更多代码行,这些代码行很容易成为内部查询处理的一部分。

我理解他在这篇文章中的担忧,但我同意戴尔的观点。也许中途之家是有一个标志来说明 Ormlite 应该以哪种方式处理查询方法的参数。

我钦佩 Ormlite 中“可编程” SQL 的灵活性和简单性,并且在几乎所有情况下,Ormlite 相关代码都简洁、易于理解且符合逻辑。这是一种罕见的情况,我觉得它比必要的更冗长,没有任何净收益。只是我的观点。

于 2013-07-13T04:32:06.107 回答