Я строю свою sql
строку следующим образом:
String sql = "SELECT * FROM horse WHERE 1=1 ";
if (horse.getName() != null) {
sql += "AND UPPER(name) LIKE ? ";
}
if (horse.getDescription() != null) {
sql += "AND UPPER(description) LIKE ? ";
}
if (horse.getRating() != null) {
sql += "AND rating=? ";
}
Я хочу найти соответствие для сущности в зависимости от того, какие параметры переданы. Поэтому, если переданы только name
и rating
, я получу что-то вроде: SELECT * FROM horse WHERE 1=1 AND UPPER(name) LIKE ? AND rating=?
Теперь я передаю строку sql
для запроса следующим образом:
List<Horse> matchingHorses = jdbcTemplate.query(sql, new Object[]{horse.getName()}, mapHorse());
This возвращает правильный результат, но я должен передать new Object[] {}
только те параметры, которые я знаю, что пользователь должен передать, иначе я ничего не получу. Например, если пользователь передает что-то вроде этого:
{
"description":"desc"
}
Я не получу никаких результатов, даже если есть description
с "des c". Если я сделаю это:
List<Horse> matchingHorses = jdbcTemplate.query(sql, new Object[]{horse.getName(), horse.getDescription(), horse.getRating()}, mapHorse());
и передам только имя, которое я получу:
org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [SELECT * FROM horse WHERE 1=1 AND UPPER(name) LIKE ? ];
Invalid value "2" for parameter "parameterIndex" [90008-200]; nested exception is org.h2.jdbc.JdbcSQLDataException: Invalid value "2" for parameter "parameterIndex" [90008-200]
Вот мой mapHorse()
маппер строк:
private RowMapper<Horse> mapHorse() {
return (resultSet, i) -> {
Long horseId = resultSet.getLong("id");
String horseName = resultSet.getString("name");
String horseDesc = resultSet.getString("description");
int horseRating = resultSet.getInt("rating");
return new Horse(
horseId,
horseName,
horseDesc,
horseRating,
);
};
}
Как сделать Я правильно это реализовал?