Hibernate не читает @Column при получении данных через @Query - PullRequest
0 голосов
/ 23 апреля 2019

Я создал собственный метод, который применяет аннотацию @Query для извлечения данных из базы данных SQL.Этот метод использует String вместе с Pageable в качестве аргумента.Этот Pageable содержит мою информацию подкачки, такую ​​как запрошенная страница, предел вхождений, направление сортировки и свойство.

Всякий раз, когда мой Pageable передает имя свойства для сортировки, Hibernate использует это же имя для поиска столбца в БД., хотя я аннотировал имя другой колонки на модели.У меня не было этой проблемы с примерами запросов или реализациями производных методов.

Я уже попробовал приведенную ниже конфигурацию, без каких-либо изменений в том, как Hibernate ищет имя столбца.Как я могу заставить Hibernate искать правильное имя столбца в БД?

spring.jpa.hibernate.naming.implicit- 
strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical- 
strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

Пример: если в моей странице есть «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 Ответ

0 голосов
/ 23 апреля 2019

Вы указываете собственный запрос. Это само по себе поддерживается, но документация Spring Data отмечает, что:

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

(Ударение добавлено.) Таким образом, если вы хотите управлять порядком сортировки, тогда вы можете либо вместо этого использовать запрос JPQL, либо встроить желаемый порядок сортировки в запрос с предложением ORDER BY. Я не сразу понимаю, почему первый вариант не подходит для представленного запроса, а второй, безусловно, является вариантом.

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