ORMLite QueryBuilder.orderByRaw (String, SelectArg) игнорирует SelectArg для QueryBuilder.queryRaw () - PullRequest
0 голосов
/ 17 октября 2019

У меня есть свежий 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, не боясь позволитьвозможна ли инъекция?

1 Ответ

0 голосов
/ 02 ноября 2019

Я действительно не думаю, что это ошибка @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, похоже, не влияет на порядок сортировки в моих тестах.

...