【问题标题】:How to Convert varchar date type to date format in JPA Criteria Builder?如何在 JPA Criteria Builder 中将 varchar 日期类型转换为日期格式?
【发布时间】:2021-09-22 16:57:20
【问题描述】:

例如,我的系统中有一个 MySQL 表(sample_table)

Name column_value frequency
AAA 08/24/2020 12:23:10 -6
BBB 09/24/2020 12:23:10 -5
ABC 10/23/2027 12:23:10 -3
DBC 01/08/2016 12:23:10 -1

我想根据 column_value 列按排序顺序创建一个选择查询。 column_value 列是 varchar 类型。 我想使用这个查询来获取结果集。 select * from sample_table order by str_to_date(column_value, '%m/d%/%Y'); 我正在使用 JPA。

TypedQuery<?> buildCriteriaQuery(Class<?> clazz, Class<?> resultClass, String... columnsToSelect) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
if (resultClass == null) {
    resultClass = clazz;
}

CriteriaQuery<?> criteriaQuery = criteriaBuilder.createQuery(resultClass);
Root<?> root = criteriaQuery.from(clazz);

## I want to add orderby criteria using criteriaBuilder

Path<Object> columnValue = root.get("columnValue");
javax.persistence.criteria.Expression<String> timeStr = criteriaBuilder.function("STR_TO_DATE", String.class, columnValue, criteriaBuilder.literal("'%m/%d/%Y %r'"));
criteriaQuery.orderBy(criteriaBuilder.asc(timeStr));
TypedQuery<?> executableQuery = entityManager.createQuery(criteriaQuery);
return executableQuery;
}

但我遇到了异常

原因:org.h2.jdbc.JdbcSQLException:找不到函数“STR_TO_DATE”; SQL 语句: 选择 valfq0_.name 作为名称,valfq0_.COLUMN_VALUE 作为 column_v5_15_,valfq0_.frequency 作为 value_fr6_15_ 从 STR_TO_DATE(valfq0_.COLUMN_VALUE,?) asc limit 的顺序中选择? [90022-197]

我想知道有没有办法在 orderby 语句中实现 str_to_date 转换。 **注意:** 我的 JPA 查询是针对 MySql 数据库的。

【问题讨论】:

    标签: java mysql hibernate jpa criteria


    【解决方案1】:

    在查询中格式化日期、时间、日期时间和时间戳类型是不好的做法。您应该直接使用支持的java.time.* 类型或java.sql.Date/java.sql.Time/java.sql.Timestamp 类型,或java.util.Date 并设置TemporalType。您应该在您的 java 应用程序中处理转换为所需的客户端格式。

    【讨论】:

    • 我完全同意你的观点,但这是一种特殊情况,column_value 实际上是为了保留所有数据类型的值,我们将它用于列分析统计。应该是这样的。有一个要求,我需要对这个值列进行排序。
    • 同样的规则也适用。你也得到了这个例外,因为你是在 H2 数据库上执行它,而不是 MySQL。 str_to_date 是 mysql 特有的函数。
    猜你喜欢
    • 1970-01-01
    • 2013-08-13
    • 2012-10-28
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多