我有一个似乎是个错误的东西。我可以在数据库中添加一个条目,该条目在文本中有一个引号。
但是,当我使用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行
欢迎任何建议。
答案 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相关代码都简洁,易于理解和遵循逻辑。这是一个罕见的情况,我觉得它比必要的更冗长,没有净收益。只是我的意见。