java - IntelliJIDEA 使用 JPA(休眠 H2 方言)显示类型不匹配错误,但代码编译
问题描述
这是我的 IDE (IntelliJ IDEA) 向我展示的:
但是,当我编译时,似乎没有任何错误!starttime 变量是一个 OffsetDateTime 变量。
为什么在我的 IDE 中显示错误?
更新
我还尝试重新启动 IDE 并使缓存无效,但没有任何反应。
这是我的 pom.xml 文件,其中包含所有依赖项:
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>...</groupId>
<artifactId>...</artifactId>
<packaging>jar</packaging>
<name>...</name>
<version>1.0.0</version>
<properties>
<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<springfox-version>2.8.0</springfox-version>
<rest-assured.version>2.9.0</rest-assured.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
</parent>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringFox dependencies -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox-version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${springfox-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>0.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</dependency>
<!-- Persistence -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<!-- Bean Validation API support -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- Tests -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>rest-assured</artifactId>
<version>${rest-assured.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
解决方案
CAST
是一个允许将数据库值转换为特定数据库类型的函数:
使用 CAST 将值转换为特定的数据库类型。
用法
CAST 函数独立于数据库,但需要数据库支持。
处理此类查询的最干净且无错误的方法是提供一种替代方法,将分别与存储值匹配的类型作为参数,OffsetDateTime
在您的情况下,根据您的业务逻辑结合转换模式:
@Query("SELECT t FROM Transaction t WHERE t.userId = ?1
AND t.startTime BETWEEN ?2 AND ?3")
List<Transaction> getUserTransactionsBetweenTwoDates(final Long userId,
final OffsetDateTime begin, final OffsetDateTime end);
否则,您仍然可以将结果OffsetDateTime
值TIMESTAMP
转换为 sql 类型DATE
:
@Query("SELECT t FROM Transaction t WHERE t.userId = ?1 AND (CAST(t.startTime AS DATE)) BETWEEN ?2 AND ?3")
List<Transaction> getUserTransactionsBetweenTwoDates(final Long userId, final LocalDate begin, final LocalDate end);
推荐阅读
- bash - 如何将配置文件中的相同单词替换为数组中的不同单词
- python - 如何使用 boost.python 将字典列表从 C++ 返回到 python 而不会泄漏内存?
- objective-c - 以编程方式访问 AWS IAM 用户策略和访问
- apache-spark - SparkFiles.get() 方法无法找到,因为 Input Split 在末尾添加了字符串
- sql - 返回带有透视数据的多列
- python - 静态文件不起作用:未找到:/{static 'logo.png'}
- composer-php - 使用 bitbucket repo 和 composer deployer 进行部署时,我是否遗漏了什么?
- javascript - 解析平台 - 如何仅基于指针 a 进行查询
- c - 指向视频内存的指针有些奇怪(0xB8000)
- android - 如何正确覆盖 Resource 类以实现动态翻译系统?