Столбец «DATE_OF_BIRTH» не найден; Оператор SQL:

Когда я пытаюсь обновить объект 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" !?

Rostan 27.10.2018 00:49

Я думаю, проблема здесь в том, что вы путаете физическое имя столбца с «сопоставленным» именем столбца. Фактическое имя столбца базы данных выглядит как date_of_birth, отображаемое имя - dateOfBirth. Вы должны использовать только сопоставленные имена в своем JPQL.

Tom Drake 27.10.2018 01:04

@Rostan Да, я могу получить объект пользователя из базы данных и узнать его дату,

karol512 27.10.2018 01:10

@TomDrake Разве не dateOfBirth - это просто имя параметра запроса? (замена dateOfBirth на date_of_birth в методе обновления ничего не изменила)

karol512 27.10.2018 01:15

Итак, проблема возникает только тогда, когда вы пытаетесь обновить данные пользователя?

Rostan 27.10.2018 01:20

@Rostan Точно, другой тест работает нормально, поэтому я думаю, что проблема в методе обновления

karol512 27.10.2018 01:28

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

cleberz 27.10.2018 01:43

@ckeberz Как я уже упоминал выше, я пробовал это, и результат был таким же.

karol512 27.10.2018 01:47

Я только что заметил, что вы определили dateOfBirth как LocalDate. Попробуйте переопределить это как java.sql.Date. В LocalDate интересно то, что он привязан к часовому поясу. Если вам действительно нужно использовать LocalDate, вам, вероятно, придется [определить собственное сопоставление] (мысли-on-java.org/persist-localdate-localdatetime-jpa)

Tom Drake 28.10.2018 02:39

(Этот поток stackoverflow) [stackoverflow.com/questions/23718383/… предоставляет дополнительную информацию по этому поводу и объясняет, что JPA 2.2 требуется для получения поддержки JPA для API даты / времени Java 8.

Tom Drake 28.10.2018 02:57

@TomDrake, но разве hibernate 5 не поддерживает localdate?

karol512 30.10.2018 14:29

@ karol512, Непонятно какая версия гибернации здесь используется. Стоит попробовать, так как это известная проблема с JPA.

Tom Drake 30.10.2018 21:23
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
12
327
0

Другие вопросы по теме