【问题标题】:Spring Data JPA - How can I fetch data from a Date column using only month and day?Spring Data JPA - 如何仅使用月份和日期从日期列中获取数据?
【发布时间】:2018-05-22 23:59:07
【问题描述】:

我有一个使用 mysql 的简单 Spring Data JPA 项目,我需要获取与日期和月份匹配的所有寄存器。我需要过滤的列是日期时间类型。

1935-12-08 00:00:00

如果我想在数据库级别执行此操作,它可以正常工作:

SELECT * FROM my_database.event where event_date LIKE '%-12-08%';

它将日期视为字符串。现在我需要在我的存储库中执行此操作,但似乎没有任何效果。我尝试了基本的:

List<Event> findByEventDateLike(
        @Param("eventDate") Date eventDate);

但它说它返回一个非法参数异常,因为它是一个 Date 对象。我尝试了其他组合,但显然 spring data jpa 无法将日期与部分信息进行比较。

注意:为了保持简洁,我尽量避免使用@Query 语句,但如果这是唯一的方法,那么它是一个有效的答案。

我该怎么做?

【问题讨论】:

  • 如果你想像 '%%' 一样使用你必须将类型更改为字符串
  • 把方法名改成findByEventDateGreaterThanAndEventDateLessThan(Date startDate, Date endDate)怎么样
  • 是的,特别是问题在于我需要它返回类似“历史上的这一天”的内容,因此它应该返回多年来这一天发生的所有事情。
  • @Osgux 有没有办法在不修改我的实体中的 eventDate 属性的情况下做到这一点?我在其他通话中使用它。

标签: java spring jpa spring-data spring-data-jpa


【解决方案1】:

以下代码适用于 ZonedDateTime (startDate),目前没有机会针对 DateTime 进行测试:

@Query("SELECT b FROM Box b " +
        "WHERE EXTRACT (day FROM b.startDate) = :dayOfMonth AND EXTRACT (month FROM b.startDate) = :month")
List<Box> findBoxWithParticularDayAndMonth(@Param("dayOfMonth") Integer dayOfMonth, @Param("month") Integer month);

用法:

List<Box> boxes = boxRepo.findBoxWithParticularDayAndMonth(22, 5);

【讨论】:

    【解决方案2】:

    如果您的 JPA 提供程序是 Hibernate,那么您可以在 JPQL (HQL) 查询中使用 yearmonth(和 other funcs),例如:

    @Query("select e from Event e where year(e.eventDate) = ?1 and month(e.eventDate) = ?2")
    List<Entity> getByYearAndMonth(int year, int month);
    

    【讨论】:

    • 还有 day(e.eventDate)=?3 和 hour(e.eventDate)=?4 也可以。完美!
    • 如果不是休眠?
    【解决方案3】:

    Java:日期转字符串 Convert java.util.Date to String

    @Query("select e from Event e where e.eventDate like %:eventDate%")
    List<Entity> findByEventDateLike(@Param("eventDate")String eventDate);
    

    对我来说,最简单的方法是将日期解析为字符串,但我找到了另一种解决方案,您可以尝试

    %Like% Query in spring JpaRepository https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

    包含

    findByFirstnameContaining

    ...其中 x.firstname like ?1(以 % 包裹的参数绑定)

    【讨论】:

    • 它不起作用,jpa 抛出异常它不将 eventDate 视为字符串,它仍然假定它为日期。
    【解决方案4】:

    使用 nativeQuery 模拟数据库中的查询。

    @Query(value = "SELECT * FROM events WHERE event_date Like %?1%", nativeQuery = true)
    List<Match> findByMatchMonthAndMatchDay(@Param ("eventDate") String eventDate);
    

    数据库负责 LIKE 子句的日期/字符串之间的转换。

    将参数作为“-month-day”传递(例如:-12-08)将返回日期字段中包含该字符串的事件集合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      相关资源
      最近更新 更多