Не удается получить результат при выполнении запроса из Spring Data Jpa - PullRequest
0 голосов
/ 27 февраля 2020

При выполнении следующего запроса в pgAdmin все хорошо, но когда я запускаю запрос из java кода, я получаю ошибку.

Я пытался привести переменные, но безрезультатно, я получаю ошибку синтаксиса преобразования

Интерфейс запроса:

public interface SeanceRepository extends JpaRepository<Seance, Integer>{

    @Query(value = "select * from seance, patient where extract(month from date) = ?1 "
            + "and extract(year from date) = ?2 and patient.id = seance.patient_id", 
              nativeQuery = true)
    public List<Object> getSeanceByMonthYear(String month, String year);
}

Ошибка:

org.postgresql.util.PSQLException: ERREUR: l'opérateur n'existe pas : double precision = character varying
  Indice : Aucun opérateur ne correspond au nom donné et aux types d'arguments.
Vous devez ajouter des conversions explicites de type.
  Position : 62
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440) ~[postgresql-42.2.5.jar:42.2.5]
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183) ~[postgresql-42.2.5.jar:42.2.5]
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308) ~[postgresql-42.2.5.jar:42.2.5]

Пациент. java

@Entity
@Table(name = "Patient")
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
public class Patient {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String firstName;
    private String lastName;
    private String cin;
    private Date birthDate;
    private String phoneNumber;
    private Boolean active;

    //getters and setters
}

сеанс. java

@Entity
@Table(name = "Seance")
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
public class Seance {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private Date date;

    @OneToOne
    private Patient patient;

    @OneToOne
    private TypeConsultation typeConsultation;

    private String motif;

    //getters and setters

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Как видно из https://w3resource.com/PostgreSQL/extract-function.php

Функция extract () используется для извлечения подполей, таких как год или час, из значений даты / времени. Источник должен быть выражением значения типа timestamp, time или interval. Поле является идентификатором или строкой, которая выбирает, какое поле будет извлечено из исходного значения.

Синтаксис:

extract (поле из отметки времени) или extract (поле из интервала)

Тип возврата: двойная точность.

PostgreSQL Версия: 9.3

Извлечение возвращает значение в двойном представлении, и вы пытаетесь сравнить его с varchar. Это не может быть сделано postgresSQL автоматически, вы должны сделать это явно:

@Query(value = "select * from seance, patient where extract(month from date)::varchar(255) = ?1 "
        + "and extract(year from date)::varchar(255) = ?2 and patient.id = seance.patient_id", 
          nativeQuery = true)
2 голосов
/ 27 февраля 2020

Это потому, что функция извлекает двойное число, а вы сравниваете его со строкой

...