Когда я пытаюсь обновить объект User в своем тесте, я получаю следующий результат:
2018-paź-26 22:18:24 PM [main] DEBUG org.hibernate.SQL - update "user" set "date_of_birth"=?, "email"=?, "login"=?, "password"=?, "user_rating"=? where "user_id"=?
2018-paź-26 22:18:24 PM [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [DATE] - [2018-10-26]
2018-paź-26 22:18:24 PM [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [2] as [VARCHAR] - [someEmail]
2018-paź-26 22:18:24 PM [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [3] as[VARCHAR] - [updatedLogin]
2018-paź-26 22:18:24 PM [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [4] as [VARCHAR] - [somePassword]
2018-paź-26 22:18:24 PM [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [5] as [FLOAT] - [0.0]
2018-paź-26 22:18:24 PM [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [6] as [BIGINT] - [5]
2018-paź-26 22:18:24 PM [main] DEBUG org.hibernate.SQL - update "user" set date_of_birth=?, "email"=?, "login"=?, "password"=?, user_rating=? where "user_id"=?
2018-paź-26 22:18:24 PM [main] WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 42122, SQLState: 42S22
2018-paź-26 22:18:24 PM [main] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Kolumna "DATE_OF_BIRTH" nie istnieje
Column "DATE_OF_BIRTH" not found; SQL statement:
update "user" set date_of_birth=?, "email"=?, "login"=?, "password"=?, user_rating=? where "user_id"=? [42122-197]
User.class
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private long id;
@Column(name = "email")
private String email;
@Column(name = "login")
private String login;
@Column(name = "password")
private String password;
@Column(name = "date_of_birth")
private LocalDate dateOfBirth;
@Column(name = "user_rating")
private float userRating;
//Getters and setters ommited for clarity
И метод обновления в реализации dao:
@Override
public void update(User user) {
log.info("Update user with id= " + user.getId() + ", set email= " + user.getEmail()
+ ", login = " + user.getLogin() + ", dateOfBirth= " + user.getDateOfBirth());
Query query = getSession().createQuery("update User"
+ " set date_of_birth = :dateOfBirth,"
+ " email = :email,"
+ " login = :login,"
+ " password = :password,"
+ " user_rating = :userRating where id = :id");
query.setParameter("email", user.getEmail());
query.setParameter("login", user.getLogin());
query.setParameter("dateOfBirth", user.getDateOfBirth());
query.setParameter("password", user.getPassword());
query.setParameter("userRating", user.getUserRating());
query.setParameter("id", user.getId());
int result = query.executeUpdate();
log.info("Update result: " + result);
}
Для другого теста, где я получаю пользователя из базы данных или сохраняю, нет проблем со столбцом «date_of_birth».
P.S. В треке стека я обнаружил, что столбец sql date_of_birth не находится в кавычках, тогда как в других тестах кавычки всегда появляются, возможно, проблема здесь?
org.hibernate.SQL - update "user" set date_of_birth=?, "email"=?, "login"=?, "password"=?, user_rating=? where "user_id"=?
Я думаю, проблема здесь в том, что вы путаете физическое имя столбца с «сопоставленным» именем столбца. Фактическое имя столбца базы данных выглядит как date_of_birth, отображаемое имя - dateOfBirth. Вы должны использовать только сопоставленные имена в своем JPQL.
@Rostan Да, я могу получить объект пользователя из базы данных и узнать его дату,
@TomDrake Разве не dateOfBirth - это просто имя параметра запроса? (замена dateOfBirth на date_of_birth в методе обновления ничего не изменила)
Итак, проблема возникает только тогда, когда вы пытаетесь обновить данные пользователя?
@Rostan Точно, другой тест работает нормально, поэтому я думаю, что проблема в методе обновления
Похоже, проблема в том, что Том сказал выше. Попробуйте удалить параметр date_of_birth из своего запроса JPQL, чтобы увидеть, исчезнет ли проблема или просто переместится в другой столбец.
@ckeberz Как я уже упоминал выше, я пробовал это, и результат был таким же.
Я только что заметил, что вы определили dateOfBirth как LocalDate. Попробуйте переопределить это как java.sql.Date. В LocalDate интересно то, что он привязан к часовому поясу. Если вам действительно нужно использовать LocalDate, вам, вероятно, придется [определить собственное сопоставление] (мысли-on-java.org/persist-localdate-localdatetime-jpa)
(Этот поток stackoverflow) [stackoverflow.com/questions/23718383/… предоставляет дополнительную информацию по этому поводу и объясняет, что JPA 2.2 требуется для получения поддержки JPA для API даты / времени Java 8.
@TomDrake, но разве hibernate 5 не поддерживает localdate?
@ karol512, Непонятно какая версия гибернации здесь используется. Стоит попробовать, так как это известная проблема с JPA.
Вы проверяли, есть ли в базе данных столбец "date_of_birth" !?