Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring JPA按LocalDate而非Instant筛选_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java Spring JPA按LocalDate而非Instant筛选

Java Spring JPA按LocalDate而非Instant筛选,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我使用的是SpringBoot2.3.1。我申请了休息。我在几乎所有的应用程序(特别是模型)中都使用java.time.Instant,但有时我会使用一些不需要时间的模型 带有日期的模型类似于: @NotNull @Column(nullable = false, columnDefinition = "DATE") private Instant date; 我确实使用Hibernate+Mysql 8设置为在UTC时区工作。当我存储日期没有时间,但是我考虑日期在系统的时

我使用的是SpringBoot2.3.1。我申请了休息。我在几乎所有的应用程序(特别是模型)中都使用java.time.Instant,但有时我会使用一些不需要时间的模型

带有日期的模型类似于:

@NotNull
@Column(nullable = false, columnDefinition = "DATE")
private Instant date;
我确实使用Hibernate+Mysql 8设置为在UTC时区工作。当我存储日期没有时间,但是我考虑日期在系统的时区。< /P> 因此,我确实希望使用LocalDate进行查询,以便在没有时间的情况下对日期进行筛选。这是我的Spring存储库的方法

@Transactional(readOnly = true)
@Query("from Document WHERE d.date>=:from AND d.date<=:until ORDER BY d.id ASC")
List<Object[]> export(@Param("from") LocalDate from, @Param("until") LocalDate until);
@Transactional(readOnly=true)

@查询(“从文档,其中d.date>=:从和d.date您的错误消息包括以下内容:

与预期类型[java.time.Instant]不匹配

表示如中所示的一个时刻,一天中的一个时间和零小时分秒的一个日期

因此,您似乎在询问如何使用日期查询类似于SQL标准类型的数据库列,该类型的时间戳具有时区。该数据库类型跟踪时间轴上的时刻、特定点

日期因地区而异 要知道,在任何给定的时刻,日期在全球各地因时区而异。在日本东京,它可以是“明天”,而在美国俄亥俄州托莱多,它可以是“昨天”。在法国巴黎,午夜后几分钟是新的一天,而在魁北克山,它仍然是前一天

因此,只有日期是不明确的,在您将其置于时区或UTC偏移量的上下文中之前,它没有特定的含义

LocalDate ld = LocalDate.parse( "2020-07-03" ) ;
获取当天的第一个时刻,如特定地区的人们使用的挂钟时间所示。换句话说,是一个时区

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime start = ld.atStartOfDay( z ) ;
半开 您的查询既需要结束,也需要开始。通常,在定义时间跨度时,最好使用半开放方法:开始是包含的,而结束是独占的。这允许跨度整齐地彼此相邻,没有间隙,也没有重叠

全天 因此,一整天从一天的第一个时刻开始,一直持续到第二天的第一个时刻,但不包括第二天的第一个时刻

ZonedDateTime end = ld.plusDays( 1 ).atStartOfDay( z ) ;
因此,请指定您感兴趣的时区。您希望将行绑定到在
非洲/突尼斯
美洲/埃德蒙顿
亚洲/加尔各答
或其他地方看到的日期吗


您的查询逻辑
其中d.date>=:from和d.date转换开始日期和开始日期意味着
00:00:00
,结束日期和结束日期意味着
23:59:59.999999
。然后转换为即时。@BasilBourque已经解释了为什么需要这样做

Instant start = from.atStartOfDay().toInstant(ZoneOffset.UTC);
Instant end = until.atTime(LocalTime.MAX).toInstant(ZoneOffset.UTC);
然后在查询中使用

@Transactional(readOnly = true)
@Query("from Document WHERE d.date>=:from AND d.date<=:until ORDER BY d.id ASC")
List<Object[]> export(@Param("from") Instant start, @Param("until") Instant end);
@Transactional(readOnly=true)

@查询(“from Document WHERE d.date>=:from和d.date谢谢您的解释。我关注的是没有时间的字段。让我们想想有日期的发票(它没有时间)。我应该将它映射为一个瞬间并使用半开放的方法,还是只映射一个没有时间的LocalDate更好?事实上,像“2020-07-01”这样的日期并不代表一个特定的时间点。我可以像存储在DB中一样存储它,而不必考虑时区。@drenda查看您的错误:
与预期的类型不匹配[java.time.Instant…
。显然,您的数据库或JPA模型中有不止一个日期(我不使用JPA,也不知道其中的问题).a
Instant
表示UTC中的一个时刻,一天中的一个时间,偏移量为零小时分秒。@drenda如果您不想在数据库中存储时间,我建议您在Enitity中使用
LocalDate
。@BasilBourque是的,在我的模型中我使用Instant,但在DB中我将列定义为日期。我认为这不是一个问题好主意。
SELECT *
FROM event_ 
WHERE happened_ !< ? AND happened_ < ?
;
myPreparedStatement.setObject( 1 , start.toOffsetDateTime() ) ;
myPreparedStatement.setObject( 2 , stop.toOffsetDateTime() ) ;
myPreparedStatement.setObject( 1 , start.toInstant() ) ;
myPreparedStatement.setObject( 2 , stop.toInstant() ) ;
OffsetDateTime start = ld.atStartOfDay( ZoneOffset.UTC ).toOffsetDateTime() ; 
Instant start = from.atStartOfDay().toInstant(ZoneOffset.UTC);
Instant end = until.atTime(LocalTime.MAX).toInstant(ZoneOffset.UTC);
@Transactional(readOnly = true)
@Query("from Document WHERE d.date>=:from AND d.date<=:until ORDER BY d.id ASC")
List<Object[]> export(@Param("from") Instant start, @Param("until") Instant end);