【问题标题】:SQL Query with JpaRepository: how to filter LocalDateTime based only on year, month and day?使用 JpaRepository 进行 SQL 查询:如何仅根据年、月和日过滤 LocalDateTime?
【发布时间】:2019-09-30 19:43:23
【问题描述】:

我有一个实体“Show”,它有一个名为“start”的 LocalDateTime 变量:

public class Show {
    //--other code---
    @Column(nullable = false)
    private LocalDateTime start;
    //--other code---
}

我只想根据年、月和日从我的数据库中进行选择,而忽略小时和分钟。

我目前的查询是:

@Query(value = "SELECT * FROM show s WHERE s.event_id = :eventId 
AND DATEPART(year, s.start) = DATEPART(year, :dateSearch) 
AND DATEPART(month, s.start) = DATEPART(month, :dateSearch) 
AND DATEPART(day, s.start) = DATEPART(day, :dateSearch)", nativeQuery = true)
Page<Show> findAllFiltered(@Param("eventId") Long eventId, @Param("dateSearch") LocalDateTime dateSearch, Pageable page);

当我尝试执行该查询时,我收到一个 500 错误代码,并显示以下消息:

“无法准备语句;嵌套异常是 org.hibernate.exception.GenericJDBCException: 无法准备语句”

编辑:使代码块中的查询更易于阅读

【问题讨论】:

  • 异常的原始“原因”是什么,即真正的错误?

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


【解决方案1】:

我建议您改为使用日期/时间范围,而不是单个值。如果表恰好在event_id, start 上有一个索引,那在查询中也会表现得更好

类似这样的:

@Query(value = "SELECT *" +
                " FROM show s" +
               " WHERE s.event_id = :eventId" +
                 " AND s.start >= :startDate" +
                 " AND s.start < :endDate", nativeQuery = true)
Page<Show> findAllFiltered(@Param("eventId") Long eventId,
                           @Param("startDate") LocalDateTime startDate,
                           @Param("endDate") LocalDateTime endDate,
                           Pageable page);

请注意,endDate 是独占的,这在 Java 中的所有范围操作中最常见。

如果需要,您可以添加一个辅助方法:

Page<Show> findAllFiltered(@Param("eventId") Long eventId,
                           @Param("dateSearch") LocalDateTime dateSearch,
                           Pageable page) {
    LocalDateTime startDate = dateSearch.truncatedTo(ChronoUnit.DAYS);
    LocalDateTime endDate = startDate.plusDays(1);
    return findAllFiltered(eventId, startDate, endDate, page);
}

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 2018-06-07
    • 2011-09-11
    • 1970-01-01
    • 2021-11-25
    • 2015-01-24
    相关资源
    最近更新 更多