从 Spring Data Jpa 运行查询时无法获得结果

Posted

技术标签:

【中文标题】从 Spring Data Jpa 运行查询时无法获得结果【英文标题】:Can't get result when running the query from Spring Data Jpa 【发布时间】:2020-06-11 08:32:39 【问题描述】:

在 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]

Patient.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

seance.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

【问题讨论】:

你能把错误信息翻译成英文吗? @Jens error operator does not exist double precision = character varying 看起来extract(month from date) 没有返回字符。尝试明确投射它 【参考方案1】:

这是因为函数提取了一个双精度,然后你将它与一个字符串进行比较

【讨论】:

【参考方案2】:

正如您在https://w3resource.com/PostgreSQL/extract-function.php 中看到的那样

提取函数()用于检索子字段,例如年份或 日期/时间值的小时。源必须是一个值表达式 输入时间戳、时间或间隔。该字段是标识符或 选择要从源值中提取的字段的字符串。

语法:

提取(时间戳中的字段)或提取(间隔中的字段)

返回类型:双精度。

PostgreSQL 版本:9.3

extract 返回一个双精度值,您尝试将其与 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)

【讨论】:

以上是关于从 Spring Data Jpa 运行查询时无法获得结果的主要内容,如果未能解决你的问题,请参考以下文章

spring data jpa使用repository进行查询,使用userRepository.getOne(id)和userRepository.findById(id)无法从数据库查询到数据

Spring Data 系列学习Spring Data JPA 自定义查询,分页,排序,条件查询

Spring Data JPA:查询ManyToMany,如何从映射类中获取数据?

无法在 FROM 子句中使用子查询编写 JPQL 查询 - Spring Data Jpa - Hibernate

无法在 FROM 子句中使用子查询编写 JPQL 查询 - Spring Data Jpa - Hibernate

Spring Data JPA 通过查询从实体获取投影