我有一个新鲜的QueryBuilder<Card, Integer>,我想使用orderByRawSelectArg

//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的文档时,我对它应该做什么感到困惑。 ASCDESC似乎不影响测试中的排序顺序。

07-28 01:44