gpt4 book ai didi

java - ORMLite QueryBuilder.orderByRaw(String, SelectArg) 忽略 QueryBuilder.queryRaw() 上的 SelectArg

转载 作者:行者123 更新时间:2023-12-01 22:59:30 26 4
gpt4 key购买 nike

我有一个新鲜的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() ),空值排在最后,所有内容都按 occupation 排序。升序。

调试

protected abstract void appendStatementEnd(StringBuilder sb, List<ArgumentHolder> argList) throws SQLException;

上面的方法会添加SelectArgs在 argList 中,然后 queryRaw()仅使用 preparedStamenteString() 进行调用而不是任何 String... arguments ,这是很自然的,因为我首先使用 qBuilder.queryRaw() 这样调用它,导致调用以下方法:

public GenericRawResults<String[]> queryRaw() throws SQLException {
return dao.queryRaw(prepareStatementString());
}

如何使用orderByRaw不用担心可能发生注入(inject)?

最佳答案

我真的不认为这是一个错误@venge。您的测试验证了查询字符串,但在执行查询时会将 ? 扩展为字符串 "testColumn",因此不会在那里扩展。您可以打开日志记录以查看是否正在运行正确的查询。如果不是,那么我们会看到有关没有指定列名 ? 或没有指定 ? 参数的问题。

2019-11-01 18:15:16,761 [TRACE] BaseMappedStatement prepared statement arguments: [testColumn] 2019-11-01 18:15:16,781 [DEBUG] StatementExecutor query of 'SELECT testColumn FROM testobject GROUP BY testColumn ORDER BY ? IS NULL ASC ' returned 4 results

我认为这里的问题是ORDER BY ... IN NULL ASC。在阅读有关使用 NULL 的文档时,我对它应该做什么感到困惑。 ASCDESC 似乎不会影响我的测试中的排序顺序。

关于java - ORMLite QueryBuilder.orderByRaw(String, SelectArg) 忽略 QueryBuilder.queryRaw() 上的 SelectArg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58427487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com