我正在使用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]
上述代码的问题是@Column(name =“ default”),要解决此问题,需要重命名“ default”列名。我还用MySQL数据库验证了相同的情况。
根据this
您可以通过将表名或列名放在映射文档中的反引号中来强制Hibernate在生成的SQL中引用标识符。传统上,Hibernate使用反引号转义SQL保留关键字,而JPA则使用双引号。
因此,您可以通过以下方式更正映射:
@Column(name = "`default`")
private boolean isDefault;
或这种方式:
@Column(name = "\"default\"")
private boolean isDefault;