如何使用 LocalDate 值查询 JPA LocalDateTime 字段?

新手上路,请多包涵

我搜索一种方法来获取在 Postgresql 数据库中 TIMESTAMPTZ 类型的字段中保存的特定 LocalDateTime 日期创建的对象列表。

为此,我尝试使用 JpaRepository:

 List<Object> findByCreationDate(LocalDate date);

但我得到错误:

 java.lang.IllegalArgumentException: Parameter value [2020-12-12] did not match expected type [java.time.LocalDateTime (n/a)]

我也尝试自己编写查询,结果相同。

到目前为止我想到的解决方案:

  1. 在 Java 中获取所有对象和过滤器(但我不想去那里,所以没有)

  2. 要在 LocalDateTime 中转换 LocalDate 参数(但我假设在这种情况下我只会看到在同一时间创建的对象,所以不会。只有当我确定时间字段是午夜时,我才会考虑此选项)。

  3. 创建一个方法 findByCreationDateBetween(LocalDateTime startOfTheDay, LocalDateTime endOfTheDay) (有趣的选项,但我想在不修改 LocalDate 的情况下进行查询,并在一天开始和结束时将其转换为 LocalDateTime。)

我还试图找到一些能够在查询中“投射” LocalDate 中的 LocalDateTime 或比较 LocalDate 和 LocalDateTime 的年、月和日的函数,但没有成功。 creationDate 的类型应保持为 LocalDateTime 和 TIMESTAMPTZ 类型的数据库字段。

是否还有其他 Jpa @Query 替代方案,总的来说,这种情况下最好的方法是什么?

原文由 user3450862 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
1 个回答

使用发布后迅速删除的答案(我必须使用列而不是属性名称,将查询标记为 nativeQuery 并选择“.*”以避免 org.postgresql.util.PSQLException: The column name id was not found in this ResultSet 错误),我找到了这个解决方案:

 @Query(value = "SELECT e.* FROM Entity e WHERE DATE(creation_date) =:date", nativeQuery = true)
List<Entity> findByCreationDate(LocalDate date);

或者,按照 这个答案,我成功地测试了第二个解决方案:

 default List<Entity> findByCreationDate(LocalDate localDate) {
    return findByPublicationDateBetween(localDate.atStartOfDay(), localDate.plusDays(1).atStartOfDay());
}

List<Entity> findByCreationDateBetween(LocalDateTime from, LocalDateTime to);

原文由 user3450862 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题