【问题标题】:How to use date_format when using JPQL/JPA使用 JPQL/JPA 时如何使用 date_format
【发布时间】:2016-04-13 23:47:57
【问题描述】:

我正在使用 MySQL 作为数据库进行 Java EE,并在我的代码上实现 JPA。

我从 MySQL Workbench 检索数据没有问题,但是当我将语法更改为 JPQL 时,它不起作用。

例如在 MySQL 中 - 它可以工作

SELECT date_format(s.date,'%Y, %m, %d') from Transactions s;

在 JPQL 中 - 它没有

SELECT date_format(s.date,'%Y, %m, %d') from TransactionEntity s;

如何修改以适应 JPA 查询?

注意: 在 JPQL 中,以下作品

SELECT s.date from TransactionEntity s;

【问题讨论】:

    标签: java mysql jpa jpql


    【解决方案1】:

    SQL 函数date_format 不是 JPQL 的一部分,正如任何文档都会告诉您的那样,因此不要认为只是将 SQL 推入 JPQL 并期望它能够工作有什么意义。

    您可以使用 JPA 2.1 执行以下操作

    function("date_format", s.date, '%Y, %m, %d')
    

    function 是一种调用任何本机 SQL 函数的方法。这显然意味着您失去了数据库独立性,因为该功能并非对所有数据存储都有效。

    【讨论】:

    • 谢谢!我现在可以使用以下语句检索格式化的值。 SELECT function('date_format', s.date,'%Y, %m, %d') from TransactionEntity s;
    【解决方案2】:

    JPQL 中提供了Sql 函数。我的 JPA 版本是 1.11.9。按天查询的示例工作组:

    @Query(value = "SELECT count(ac) as count, function('date_format', max(ac.subscriptionStartDate), '%Y, %m, %d') as date FROM MyTable ac " +
            "WHERE ac.subscriptionStartDate BETWEEN :startDate AND :endDate GROUP BY function('date_format', ac.subscriptionStartDate, '%Y, %m, %d')")
    public List<Map<String,Object>> findRegisteredCustomersHistory(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
    

    查询的结果是以格式化的形式记录按天分组的记录数的列表。

    示例行:

    count: 3, date: 2019, 09, 10
    count: 1, date: 2019, 09, 11
    

    对于您的问题,请在 JPQL 中尝试:

    @Query(value = "SELECT function('date_format', s.date, '%Y, %m, %d') as date from Transactions s;")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 2018-06-08
      • 1970-01-01
      • 2015-03-18
      • 2012-11-23
      • 2013-07-19
      • 1970-01-01
      相关资源
      最近更新 更多