我有一个新鲜的QueryBuilder<Card, Integer>
,我想使用orderByRaw
来SelectArg
。
//String column is coming from unknown source
SelectArg selectArg = new SelectArg(SqlType.STRING, column);
qBuilder.selectColumns(column).groupBy(column).orderByRaw("? IS NULL ASC", selectArg);
在此之后,我要获取
qBuilder.queryRaw()
。确实发生了一些奇怪的事情。 qBuilder
返回的原始语句是这样的:SELECT `occupation` FROM `card` GROUP BY `occupation` ORDER BY ? IS NULL ASC
?
不会替换为此处的occupation
,并且按预期,在对象的顺序中首先出现空值。虽然,如果这样做:
qBuilder.selectColumns(column).groupBy(column).orderByRaw(column + " IS NULL ASC");
排序按预期工作(再次使用
qBuilder.queryRaw()
),null排在最后,并且所有内容均按occupation
升序排序。调试
protected abstract void appendStatementEnd(StringBuilder sb, List<ArgumentHolder> argList) throws SQLException;
上面的方法将在argList中添加
SelectArgs
,但是随后,仅使用queryRaw()
而不使用任何preparedStamenteString()
来调用String... arguments
,这很自然,因为我首先使用qBuilder.queryRaw()
调用了它。 ,导致调用以下方法:public GenericRawResults<String[]> queryRaw() throws SQLException {
return dao.queryRaw(prepareStatementString());
}
如何使用
orderByRaw
而不担心会进行可能的注射? 最佳答案
我真的不认为这是@venge的错误。您的测试验证了查询字符串,但是在执行查询时会发生?
扩展为字符串"testColumn"
的情况,因此不会在此处扩展。您可以打开日志记录以查看正确的查询正在运行。如果不是,那么我们将看到有关没有列名?
或未指定?
参数的问题。
2019-11-01 18:15:16,761 [TRACE] BaseMappedStatement准备的语句参数:[testColumn]
2019-11-01 18:15:16,781 [DEBUG] StatementExecutor查询'SELECT testColumn
FROM testobject
GROUP BY testColumn
ORDER BY吗? IS NULL ASC'返回4结果
我认为这里的问题是ORDER BY ... IN NULL ASC
。在阅读有关使用NULL的文档时,我对它应该做什么感到困惑。 ASC
或DESC
似乎不影响测试中的排序顺序。