【发布时间】: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