如何在使用JPQL / JPA时使用date_format

时间:2016-01-09 08:55:05

标签: java mysql jpa jpql

我正在使用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;

2 个答案:

答案 0 :(得分:4)

SQL函数date_format不是JPQL的一部分,正如任何文档都会告诉你的那样,所以不要把SQL推入JPQL并期望它能够工作。

使用JPA 2.1可以执行的操作如下

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

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

答案 1 :(得分:0)

Sql函数在JPQL中可用。我的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;")