How to Convert varchar date type to date format in JPA Criteria Builder?

Viewed 586

I have a MySQL table(sample_table) in my system for example

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

I want to create a select query in sorted order based on the column_value column. column_value column is varchar type. I want to use this query to get the result set. select * from sample_table order by str_to_date(column_value, '%m/d%/%Y'); I am using 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;
}

But I am getting exception

Caused by: org.h2.jdbc.JdbcSQLException: Function "STR_TO_DATE" not found; SQL statement: select valfq0_.name as name, valfq0_.COLUMN_VALUE as column_v5_15_, valfq0_.frequency as value_fr6_15_ from order by STR_TO_DATE(valfq0_.COLUMN_VALUE,?) asc limit ? [90022-197]

I wanted to know is there any way to achieve str_to_date conversion in orderby statement. **Note : ** My JPA query is for MySql db.

1 Answers

Formatting date, time, datetime and timestamp types in the query is bad practice. You should use the supported java.time.* types directly or java.sql.Date/java.sql.Time/java.sql.Timestamp types, or java.util.Date and setting TemporalType. You're supposed to handle the conversion to the desired client format in your java application.

Related