java - 将 java.sql.Date 转换为 java.time.LocalDate 时出现 Java spring boot Jpa 错误
问题描述
我正在使用 Java 11 和 Spring boot v2.3.3.RELEASE。下面是我的 pom.xml。我正在尝试从 DB 函数中获取数据,该函数将返回 2 列和 1 行。返回的列是 Date (Postgres SQL)。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.group</groupId>
<artifactId>artifact</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我有以下模型类。
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDate;
public class CachedDate {
@JsonFormat(
shape = JsonFormat.Shape.STRING,
pattern = "yyyy-MM-dd",
locale = "en_CA")
private LocalDate businessDate;
@JsonFormat(
shape = JsonFormat.Shape.STRING,
pattern = "yyyy-MM-dd",
locale = "en_CA")
private LocalDate previousBusinessDate;
// constructor/ getter and setter ommited
}
我有一个存储库,我试图在其中获取基于 DB 函数调用的数据。
Query query = entityManager.createNativeQuery(
"SELECT * FROM get_function(:date)"
);
query.setParameter("date", date);
List<Object> result = (List<Object>) query.getResultList();
Iterator it = result.iterator();
CachedDate dates = new CachedDate();
while (it.hasNext()) {
Object[] row = (Object[]) it.next();
//dates.setBusinessDate((LocalDate) row[0]);
//dates.setPreviousBusinessDate((LocalDate) row[1]);
// This gives error 1
dates.setBusinessDate(LocalDate.parse((String) row[0]));
dates.setPreviousBusinessDate(LocalDate.parse((String) row[1]));
// This gives error 2
}
错误 1:
Caused by: java.lang.ClassCastException: class java.sql.Date cannot be cast to class java.time.LocalDate (java.sql.Date is in module java.sql of loader 'platform'; java.time.LocalDate is in module java.base of loader 'bootstrap')
错误 2:
Caused by: java.lang.ClassCastException: class java.sql.Date cannot be cast to class java.lang.String (java.sql.Date is in module java.sql of loader 'platform'; java.lang.String is in module java.base of loader 'bootstrap')
这里有什么问题?我不能将模型类作为实体,因为它不是我的数据库中的对象。这正是函数返回的内容。不确定这是否会有所帮助。
你能在这里帮忙吗?
解决方案
您的查询的返回类型是java.sql.Date
. 您必须先将其转换为java.sql.Date
然后调用.toLocalDate()
以将其转换为LocalDate
.
样本:
dates.setBusinessDate(((java.sql.Date) row[0]).toLocalDate());
dates.setPreviousBusinessDate(((java.sql.Date) row[1]).toLocalDate());
推荐阅读
- database - 短信日志的猫鼬模式
- google-bigquery - TIMESTAMP_SECONDS 解析错误
- xamarin - 我如何从 TFS 连接 Visual Studio App 中心(本地)
- google-cloud-firestore - 具有时间戳格式 ID 的文档的 Firestore 备份
- r - 将文本/pdf文件中的信息抓取到R中时遇到问题
- generic-programming - Eiffel:有没有办法在没有任何附加实例的情况下测试给定类的通用参数?
- visual-studio-app-center - 我可以删除 Push.SetSenderID(string) 现在它已经过时了吗?
- angular - Angular / Material中的内联表单元素
- sql - 如何使用 bcp 命令将文本文件读入表变量
- haskell - 仆人:查看所有请求头