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