You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过HQL根据LocalTime筛选LocalDateTime类型的endTime属性

解决方法:查询endTime时间部分在指定LocalTime区间的Work数据

你的核心问题是JPQL中TIME()函数的兼容性问题,以及参数绑定的细节处理,以下是几种可行的实现方案:

方案1:基于Hibernate扩展的JPQL写法

如果你的项目使用Hibernate作为JPA实现,可以直接使用Hibernate支持的localTime()函数,或者通过function()调用数据库原生函数,确保跨数据库兼容性:

// 方式1:使用Hibernate内置的localTime函数
@Query("SELECT new package.dto(w.id) FROM Work w WHERE localTime(w.endTime) BETWEEN :from AND :to")
List<Dto> createDtoList(@Param("from") LocalTime from, @Param("to") LocalTime to);

// 方式2:调用数据库原生TIME函数(适配MySQL等)
@Query("SELECT new package.dto(w.id) FROM Work w WHERE function('TIME', w.endTime) BETWEEN :from AND :to")
List<Dto> createDtoList(@Param("from") LocalTime from, @Param("to") LocalTime to);

方案2:类型安全的Criteria API实现

如果不想依赖特定JPA实现的语法,可以用Criteria API构建查询,更灵活且类型安全:

public List<Dto> findWorkByEndTimeTimeRange(LocalTime from, LocalTime to) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Dto> query = cb.createQuery(Dto.class);
    Root<Work> workRoot = query.from(Work.class);

    // 提取endTime的时间部分,根据数据库调整函数名:MySQL用TIME,PostgreSQL用CAST(... AS TIME)
    Expression<LocalTime> endTimePart = cb.function("TIME", LocalTime.class, workRoot.get("endTime"));
    
    query.select(cb.construct(Dto.class, workRoot.get("id")))
         .where(cb.between(endTimePart, from, to));

    return entityManager.createQuery(query).getResultList();
}

方案3:原生SQL查询(直接适配数据库)

如果JPQL的函数支持有问题,直接用原生SQL是最稳妥的方式,不同数据库写法略有差异:

MySQL版本

@Query(value = "SELECT id FROM work WHERE TIME(end_time) BETWEEN :from AND :to", nativeQuery = true)
List<Long> getWorkIdsByEndTimeRange(@Param("from") LocalTime from, @Param("to") LocalTime to);
// 之后可以手动将id转换为Dto

PostgreSQL版本

@Query(value = "SELECT id FROM work WHERE CAST(end_time AS TIME) BETWEEN :from AND :to", nativeQuery = true)
List<Long> getWorkIdsByEndTimeRange(@Param("from") LocalTime from, @Param("to") LocalTime to);

额外注意事项

  • 如果需要处理跨天时间区间(比如从22:00到次日02:00),需要调整条件为:TIME(w.endTime) >= :from OR TIME(w.endTime) <= :to
  • 确保数据库中endTime字段的类型是datetime/timestamp,能正确提取时间部分
  • 必须添加@Param注解绑定参数,避免Spring Data JPA的参数顺序匹配错误

内容的提问来源于stack exchange,提问作者Gabor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:50:44