Не могу взять 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

