org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar
Получаю следующую ошибку на
GET-запрос:
{
"timestamp": "2025-01-01T19:53:26.424+00:00",
"status": 500,
"error": "Internal Server Error",
"trace": "org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [select id, name, description from roll_data]\r\n\tat",
"message": "PreparedStatementCallback; bad SQL grammar [select id, name, description from roll_data]",
"path": "/rolls/all"
}
Сам запрос:
public static final String GET_ALL_ROLLS = "select id, name, description from roll_data";
Entity:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "roll_data", schema = "rolls")
public class RollEntity {
public Long getId() {
return id;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "description")
private String description;
}
Маппер:
@Component
public class RollMapper implements RowMapper<RollDto> {
@Override
public RollDto mapRow(ResultSet rs, int rowNum) throws SQLException {
return new RollDto(
rs.getLong("id"),
rs.getString("name"),
rs.getString("description")
);
}
}
DTO:
@Data
public class RollDto {
private Long id;
private String name;
private String description;
public RollDto(Long id, String name, String description) {
this.id = id;
this.name = name;
this.description = description;
}
public RollDto() {
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setDescription(String description) {
this.description = description;
}
public Long id() {
return id;
}
public String name() {
return name;
}
public String description() {
return description;
}
}
Репозиторий:
@Repository
public class RollRepositoryImpl implements RollRepository {
private final NamedParameterJdbcTemplate jdbcTemplate;
private RollMapper rollMapper;
public RollRepositoryImpl(NamedParameterJdbcTemplate jdbcTemplate, RollMapper rollMapper) {
this.jdbcTemplate = jdbcTemplate;
this.rollMapper = rollMapper;
}
@Override
public List<RollDto> allRolls() throws NullPointerException{
MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource();
return new
ArrayList<>
(jdbcTemplate.query(Sql.GET_ALL_ROLLS, mapSqlParameterSource, rollMapper));
}
}
В базе данных тот же запрос работает.
Ответы (1 шт):
Вы неправильно понимаете как работает @Data
аннотация:
@Data – это сокращенная аннотация, сочетающая возможности
@ToString
,@EqualsAndHashCode
,@Getter
@Setter
и@RequiredArgsConstructor
. Так что@Data
генерирует весь шаблонный код, вовлеченный в работу с объектами POJO (Plain Old Java Objects). Это, в частности, дает нам геттеры для всех полей, сеттеры для всех нефинальных полей, правильные реализацииtoString
,equals
иhashCode
, охватывающие все поля класса, а также конструктор для всех финальных полей.
Видимо, вам необходимо исправить код и поудалять самописные методы и конструкторы из классов, и убедиться что ломбок правильно работает. После перекомпиляции ошибка должна уйти.