Sql использование ключевого слова в качестве имени столбца сущности jpa - PullRequest
2 голосов
/ 12 февраля 2020

Я использую JPA и PostgreSQL, я получил ошибку

org.postgresql.util.PSQLException: ERROR: syntax error at or near "default"

, когда я хочу обновить существующие данные, но она показывает ошибку. Как я могу проверить причину этой ошибки?

Это мой код

Резюме. java

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Table(name = "resume")
public class Resume extends AuditModel implements Serializable {

    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(
            name = "UUID",
            strategy = "org.hibernate.id.UUIDGenerator"
    )
    @Column(name = "resume_id", updatable = false, nullable = false)
    private UUID id;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_id", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonIgnore
    private User user;

    @NotNull(message = "First name may not be blank")
    @Column(name = "first_name")
    private String firstName;

    @NotNull(message = "Last name may not be blank")
    @Column(name = "last_name")
    private String lastName;

    @Column(name = "default")
    private boolean isDefault;

    @ElementCollection
    @CollectionTable(
            name = "resume_experience",
            joinColumns = @JoinColumn(name = "resume_id")
    )
    private List<Experience> experiences;

    ...

}

Опыт работы. java

@Embeddable
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class Experience implements Serializable {

    @Column(name = "current_job")
    private boolean currentJob;

    @NotNull
    @Column(name = "start_date")
    private Date startDate;

    ...
}

Это метод обновления резюме. ResumeService. java

public Resume updateResume(UUID resumeId, Resume resume) throws ResumeNotFoundException {

   Resume targetResume = resumeRepository.findById(resumeId).orElseGet(null);

   if (targetResume != null){
      resume.setId(targetResume.getId());
      resume.setUser(targetResume.getUser());
      resume.setCreatedAt(targetResume.getCreatedAt());
      return resumeRepository.save(resume);
   } else {
      throw new ResumeNotFoundException("Resume not found");
   }
}

Сообщение об ошибке

2020-02-12 00:23:20.113 ERROR 78958 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: syntax error at or near "default"
  Position: 124
2020-02-12 00:23:20.182 ERROR 78958 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement] with root cause

org.postgresql.util.PSQLException: ERROR: syntax error at or near "default"
  Position: 124
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2505) ~[postgresql-42.2.9.jar:42.2.9]

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

В соответствии с документацией hibernate :

Вы можете заставить Hibernate заключать в кавычки идентификатор в сгенерированном SQL, заключая имя таблицы или столбца в обратные ссылки в отображении документ. В то время как традиционно Hibernate использовал обратные метки для экранирования SQL зарезервированных ключевых слов, JPA вместо этого использует двойные кавычки.

Таким образом, вы можете исправить свое отображение следующим образом:

@Column(name = "`default`")
private boolean isDefault;

или таким образом:

@Column(name = "\"default\"")
private boolean isDefault;
1 голос
/ 12 февраля 2020

Проблема с приведенным выше кодом - @Column (name = "default"), для решения которой необходимо переименовать имя столбца "default". Я также проверил тот же сценарий с базой данных MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...