【发布时间】:2019-04-23 15:10:40
【问题描述】:
我创建了一个自定义方法,该方法应用@Query 注释从 SQL DB 中获取数据。该方法使用 String 和 Pageable 作为参数。该 Pageable 包含我的分页信息,例如请求的页面、出现次数限制、排序方向和属性。
每当我的 Pageable 传递一个属性名称进行排序时,Hibernate 都会使用相同的名称来查找数据库中的列,即使我在模型上注释了另一个列名称。对于示例查询或派生方法实现,我没有遇到这个问题。
我已经尝试过下面的配置,Hibernate 查找列名的方式没有任何改变。如何让 Hibernate 在 DB 上查找正确的列名?
spring.jpa.hibernate.naming.implicit-
strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-
strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
示例:如果我的 pageable 将“projectName”作为模型的属性名称,Hibernate 将查找 projectName 列,而不是模型上注释的“PROJECT_NAME”。我一直在使用 Hibernate 进行一些查询,自从我开始使用 @Query 以来,这个问题就开始发生了。
查询:
@Query(value = "SELECT * FROM dbo.DW_DOCUMENT WHERE (USER_CREATED LIKE ?1 OR
PROJECT_NAME LIKE ?1 OR PRIORITY LIKE ?1) AND (DOCUMENT_STATUS = 'Canceled'
OR STATUS = 'Canceled')", nativeQuery = true)
Page<Autopilot_Queue> findQuickCanceledStr(@Param("search") String search,
Pageable page);
型号:
@PropertySource("classpath:application.properties")
@Entity
@Table(name="DW_DOCUMENT")
@Component
public class Autopilot_Queue {
@Id
@GeneratedValue
@Column(name = "ID")
private Integer id;
@Column(name = "PROJECT_NAME")
private String projectName;
@Column(name = "PRIORITY")
private String priority;
@Column(name = "DOCUMENT_TEMPLATE")
private String template;
@Column(name = "STATUS")
private String processStatus;
@Column(name = "DOCUMENT_LANGUAGE")
private String language;
@Column(name = "DOCUMENT_STATUS")
private String documentStatus;
@Column(name = "USER_CREATED")
private String user;
public Autopilot_Queue() {
}
public Autopilot_Queue(Integer id, String projName, String priority, String statusProcess, String template, String language, String statusDocument, String user) {
super();
this.id = id;
this.projectName = projName;
this.priority = priority;
this.template = template;
this.processStatus = statusProcess;
this.language = language;
this.documentStatus = statusDocument;
this.user = user;
}
public Autopilot_Queue(int id, String projName, String priority, String statusProcess, String template, String language, String statusDocument, String user) {
super();
this.id = id;
this.projectName = projName;
this.priority = priority;
this.template = template;
this.processStatus = statusProcess;
this.language = language;
this.documentStatus = statusDocument;
this.user = user;
}
public Integer getID() {
return id;
}
public void setID(Integer id) {
this.id = id;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public String getPriority() {
return priority;
}
public void setPriority(String priority) {
this.priority = priority;
}
public String getProcessStatus() {
return processStatus;
}
public void setProcessStatus(String processStatus) {
this.processStatus = processStatus;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getDocumentStatus() {
return documentStatus;
}
public void setDocumentStatus(String documentStatus) {
this.documentStatus = documentStatus;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getTemplate() {
return template;
}
public void setTemplate(String template) {
this.template = template;
}
【问题讨论】:
标签: java spring hibernate spring-boot