【问题标题】:Hibernate Criteria - How to apply functions to ORDER BY?Hibernate Criteria - 如何将函数应用于 ORDER BY?
【发布时间】:2023-03-23 11:55:01
【问题描述】:

这听起来很简单的问题,但我在网上没有找到简单的解决方案。


我正在尝试在 Hibernate 中复制当前的 ORDER BY,但没有成功:

SELECT * FROM IPEM.DEMANDE
WHERE INIT_DATE >= TO_TIMESTAMP('23/04/2021', 'dd/MM/yyyy') AND INIT_DATE <= 
TO_TIMESTAMP('29/04/2021', 'dd/MM/yyyy')
ORDER BY TO_TIMESTAMP(LIMIT_DATE, 'dd/MM/yyyy'), TO_TIMESTAMP(INIT_DATE , 'dd/MM/yyyy') ASC <<< this line

为什么?因为我的数据库中有这样的数据:

05/05/2021 00:00:00 - 23/04/2021 00:00:00
05/05/2021 00:00:00 - 28/04/2021 00:00:00 << this should be 3rd
05/05/2021 02:00:00 - 24/04/2021 00:00:00 << this should be 2nd

时间弄乱了排序。我试图在加载我的条目之前忽略它们/格式化日期。我发现这样做的一种方法是将TO_TIMESTAMP 应用于ORDER_BY。在 SQL 中运行良好,但是进入 Hibernate 时,就没有那么简单了。

其实我的代码是这样的:

criteria.addOrder(Order.asc(fieldName));

我尝试了一些简单的解决方案,但显然不起作用:

criteria.addOrder(Order.asc("TO_TIMESTAMP(" + fieldName + ", 'dd/MM/yyyy')");

为此我遇到了以下错误(limitDate 是 Java 名称,LIMIT_DATE 对应的列):

org.hibernate.QueryException: could not resolve property: TO_TIMESTAMP(limitDate, 'dd/MM/yyyy')

如何将TO_TIMESTAMP 应用于我的ORDER BY 的成员? (不用担心,我们在这里假设所有成员都是日期,无论是在 Java 中还是在 SQL 表中)。

【问题讨论】:

  • 如果 LIMIT_DATE 是一个日期,您无需在 LIMIT_DATE 之前调用 TO_TIMESTAMP。 LIMIT_DATE 的列是否包含 sql 日期?
  • 我需要调用 TO_TIMESTAMP 或仅将排序限制为日/月/年,时间会弄乱我的排序。是的,它们包含 SQL 日期 (iirc)。我将添加我的用例,以便更清晰。
  • 你能创建一个原生查询吗?在数据库级别,LIMIT_DATE 和 INIT_DATE 应该是时间戳吗?你能改变列的sql类型吗?
  • 我可以创建一个本机查询,但这需要做很多工作:预先存在的代码库使用 Hibernate API。不幸的是,我也无法更改列的 SQL 类型。我想我不能按照我想要的方式使用 Hibernate 来做到这一点,就是这样。

标签: java sql hibernate hibernate-criteria


【解决方案1】:

这是不可能的,但您可以继承 Order 并覆盖 org.hibernate.criterion.Order#toSqlString 方法来实现您需要的任何逻辑。无论如何,您应该从旧的 Criteria API 转移到 JPA Criteria API。在那里你可以使用criteriaQuery.orderBy(criteriaBuilder.function("TO_TIMESTAMP", root.get(fieldName), criteriaBuilder.literal("dd/MM/yyyy")))

【讨论】:

  • 这就是我所担心的,我必须重新编写整个代码块才能让它工作......谢谢你的回答!
猜你喜欢
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 2017-02-16
  • 2012-01-19
  • 2017-11-02
  • 1970-01-01
  • 2015-02-05
相关资源
最近更新 更多