从 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
【问题讨论】:
你能把错误信息翻译成英文吗? @Jenserror 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