Не могу взять id с модели в java(srping)

Есть model Reader:

public class Reader {
    private int id;

    @NotEmpty(message = "Name shouldn't be empty!")
    @Size(min = 2, max = 100, message = "Name should be between 2 and 100 characters!")
    private String name;

    @Min(value = 0, message = "Age should be greater than 0!")
    private int age;

    public Reader(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Reader(){}

   //getters and setters...
}

А так же dao ReaderDao:

@Component
public class ReaderDao {
    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public ReaderDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    public Reader getReader(int id){
        return jdbcTemplate.queryForObject("SELECT * FROM reader WHERE reader_id=?",
                new BeanPropertyRowMapper<>(Reader.class), id);
    }
}

Я использую метод getReader в контроллере ReaderController:

@GetMapping("/{id}")
    public String readerPage(@PathVariable("id") int id,
                             Model model){
        model.addAttribute("reader", readerDao.getReader(id));
        Reader reader = (Reader) model.getAttribute("reader");
        System.out.println(reader.getId()); // всегда выводит 0
        return "readers/profile";
    }

И вот на строке с System.out.println всегда выводит 0, также есть метод где берутся все readers и там также у всех id равен 0, как с этим бороться?


Ответы (1 шт):

Автор решения: Михаил Ребров

BeanPropertyRowMapper маппит поля на одноименные колонки таблицы.

В соответствии с Вашей моделью была создана таблица:

create table reader
(
    id   int          not null  primary key,
    age  int          not null,
    name varchar(100) null
)
    engine = MyISAM
;

туда были вставлены вот такие данные

id age name
1 12 Иван Васильевич
2 34 Модест Петрович
... ... ...

Единственная проблема, которую я встретил - это несоответствие запроса полям таблицы

SELECT * FROM reader WHERE reader_id=?

Очевидно, что в классе Reader нет поля reader_id
Поэтому я заменил данный запрос на:

SELECT * FROM reader WHERE id=?

ReaderDao

@Component
public class ReaderDao {
    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public ReaderDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public Reader getReader(int id){
        return jdbcTemplate.queryForObject("SELECT * FROM reader WHERE id=?",
                new BeanPropertyRowMapper<>(Reader.class), id);
    }
}

После чего в контроллере как видите в моделе объект более чем прекрасно получается и сохраняется

введите сюда описание изображения

и в консоль все выводится

введите сюда описание изображения

Вывод

У Вас явно названия полей модели не соответствуют названиям колонок в таблице.

Вам стоит привести их к одному знаменателю

  • либо id в модели и id в таблице
  • либо reader_id в модели и reader_id в таблице

У Вас скорее всего id в модели и reader_id в таблице.
И у Вас корректно отрабатывает запрос, но при маппинге полей поле id не инициализируется, т.к. в таблице не найдено соответствующей колонки.
А так как поле вы объявили не в виде объекта Integer, а в виде примитива int - по умолчанию он вам выдает 0

→ Ссылка