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 шт):

Автор решения: Roman C

Вы неправильно понимаете как работает @Data аннотация:

@Data – это сокращенная аннотация, сочетающая возможности @ToString, @EqualsAndHashCode, @Getter @Setter и @RequiredArgsConstructor. Так что @Data генерирует весь шаблонный код, вовлеченный в работу с объектами POJO (Plain Old Java Objects). Это, в частности, дает нам геттеры для всех полей, сеттеры для всех нефинальных полей, правильные реализации toString, equals и hashCode, охватывающие все поля класса, а также конструктор для всех финальных полей.

Видимо, вам необходимо исправить код и поудалять самописные методы и конструкторы из классов, и убедиться что ломбок правильно работает. После перекомпиляции ошибка должна уйти.

→ Ссылка