春季 JPQL 处理日期

Posted

技术标签:

【中文标题】春季 JPQL 处理日期【英文标题】:Spring JPQL Processing Dates 【发布时间】:2021-03-28 06:07:12 【问题描述】:

我正在使用 Spring Boot/Framework/JPA 来读取 PostgreSQL 数据库表。但是,我有一种情况,我想从 TIMESTAMP WITH TIME ZONE / OffsetDateTime 的列中进行选择,但我只想比较日期,而不是时间。

根据我在谷歌搜索后发现的内容,我尝试了以下(在 Kotlin 中),但这两个都给了我语法错误,说它不需要左括号。如果没有这些函数,它会匹配日期和时间。

    @Query(
        """select odi from on_deck_inventory odi
        where odi.sku = :sku
        and odi.storeId = :storeId
        and date(odi.transactionDate) = :transactionDate
        and odi.restocked = :restocked
        """
    )
    @Query(
        """select odi from on_deck_inventory odi
        where odi.sku = :sku
        and odi.storeId = :storeId
        and date = cast(:transactionDate as date)
        and odi.restocked = :restocked
        """
    )

JPQL 似乎不允许在查询中使用任何类型的函数。有没有其他方法可以做到这一点?

【问题讨论】:

【参考方案1】:

问题是我使用的是 JPQL,它相当有限,并且无法识别这些功能。但是,当我使用本机 SQL 查询时,它可以工作。

    @Query(
        """select * from on_deck_inventory odi
        where odi.sku = :sku
        and odi.store_id = :storeId
        and date(odi.transaction_date) = :transactionDate
        and odi.restocked = :restocked
        """,
        nativeQuery = true
    )
    fun findBySkuAndStoreIdAndTransactionDateAndRestocked(
        @Param("sku") sku: String,
        @Param("storeId") storeId: Int,
        @Param("transactionDate") transactionDate: LocalDate,
        @Param("restocked") restocked: Boolean = false
    ): OnDeckInventoryEntity?

【讨论】:

以上是关于春季 JPQL 处理日期的主要内容,如果未能解决你的问题,请参考以下文章

春季启动数据休息中的日期问题

IndexOutOfBoundsException 春季批处理和春季启动

春季启动批处理到具有多个作业的春季云任务

春季批处理作业未读取第一行

春季批处理不处理所有记录

在春季批处理部署程序分区处理程序中定期获取正在运行的工作节点的状态