当前位置: 首页 > 知识库问答 >
问题:

通过@Query获取数据时,Hibernate不读取@Column

朱阳曜
2023-03-14

我制作了一个自定义方法,该方法应用@Query注释以从 SQL 数据库中提取数据。该方法使用字符串和可分页作为参数。该 Pageable 包含我的分页信息,例如请求的页面、出现次数限制、排序方向和属性。

每当我的 Pageable 传递属性名称进行排序时,Hibernate 都会使用相同的名称在 DB 上查找列,即使我在模型上注释了另一个列名。我在示例查询或派生方法实现方面没有遇到此问题。

我已经尝试了下面的配置,没有改变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;
}

共有1个答案

裴理
2023-03-14

您正在指定本机查询。这本身是受支持的,但是Spring数据文档指出:

Spring Data JPA目前不支持对本机查询进行动态排序,因为它必须操作声明的实际查询,而对于本机SQL,它无法可靠地执行此操作。但是,您可以通过自己指定计数查询来使用本机查询进行分页 [...]

(重点已添加。)因此,如果您想控制排序顺序,那么您的选择是使用JPQL查询,或者使用ORDER BY子句将所需的排序顺序构建到查询中。我没有立即看到为什么前者不是呈现的查询的选项,而后者当然是一个选项。

 类似资料:
  • 问题内容: 我最近开始学习Hibernate技术,不得不使用Hibernate从数据库中获取数据。问题是我只能通过SSH隧道连接到数据库。我可以在文件中使用任何属性来解决此问题吗?或者,您可以建议另一种新手可以理解的方式。 问题答案: 也许使用Jsch。一些示例可以为您提供解决之道。 另一种方法是使用HTTP代理处理程序和端口转发功能来实现自己的SSH SocketFactory。起点可以是: 您

  • 问题内容: 有没有一种方法可以通过Hibernate 3.2 API获得一些基础数据库版本的信息?我在这里和javadoc中都找不到相关的位。 问题答案: 获取数据库引擎的版本是特定于实现的。这意味着没有获取版本的共享方法,因此Hibernate不能真正提供API,因为它没有绑定到任何特定的RDBMS。例如,以下是通过一些著名的RDBMS使用SELECT语句获取版本的几种不同方法: Oracle

  • 我有一个使用redux的应用程序 我也曾在本地获取数据。 在我的反应组件中,我使用来获取数据。但我什么也没得到。 如何在我的组件中获取数据? 演示:https://codesandbox.io/s/nervous-rosalind-lp16j?file=/src/App.js:242-328

  • 我有两个表1)krs_question_bank 2)krs_options 而我正在调用Session.Save(问题)。生成了Hibernate查询,但..我有以下错误。有什么办法可以解决这个错误吗?

  • 我想通过“id”从我的mongodb获取数据。如果我的id与mongodb中id的值匹配,则它将获取该对象,但其抛出错误为: {“message”:“对于模型“PostMessage”“”的路径“\u id”处的值“s-CoAhDKd”,转换为ObjectId失败}

  • 我正在建立一个阳光应用从Udacity课程。在第2课中,我尝试将应用程序连接到OpenWeatherMap.org站点上的云,以获取城市的天气数据。首先,基本查询起作用,即URL URL=新URL(“http://api.openweathermap.org/data/2.5/forecast?id=524901&appid=c21566b1153f87e9f1d256b962cd6d42”);但