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

lp0sw83n  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(402)

我正在做Java EE与MySQL作为数据库和实现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;
cetgtptt

cetgtptt1#

SQL函数date_format不是JPQL的一部分,任何文档都会告诉您这一点,因此不要认为只是将SQL推入JPQL并期望它工作是有意义的。
使用JPA2.1可以做的是按如下方式调用它

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

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

klr1opcd

klr1opcd2#

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;")

相关问题