JPA org.postgresql.util.PSQLException:错误:“默认”或附近的语法错误

问题描述 投票:0回答:1

我正在使用JPA和PostgreSQL,当我想更新现有数据时出现错误org.postgresql.util.PSQLException: ERROR: syntax error at or near "default",但显示错误。我如何检查此错误的原因?

这是我的代码

Resume.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;

    ...

}

Experience.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]
java postgresql hibernate spring-boot jpa
1个回答
0
投票

上述代码的问题是@Column(name =“ default”),要解决此问题,需要重命名“ default”列名。我还用MySQL数据库验证了相同的情况。


0
投票

根据this

您可以通过将表名或列名放在映射文档中的反引号中来强制Hibernate在生成的SQL中引用标识符。传统上,Hibernate使用反引号转义SQL保留关键字,而JPA则使用双引号。

因此,您可以通过以下方式更正映射:

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

或这种方式:

@Column(name = "\"default\"")
private boolean isDefault;
© www.soinside.com 2019 - 2024. All rights reserved.