有人可以建议我如何使用JPA Criteria构建器API构建以下查询吗?
SELECT id, name, date, version FROM public.upgradeTable
order by (CAST(replace(version, '.', '')AS numeric)) desc;
请注意我们的版本列的值为“11.0.2.213”,“11.0.2.73”我们需要修剪字符'。'在版本中,然后将它们转换为数字,然后按desc排序。
目前,JPA没有用于replace()和cast(字符串作为数字)的API。但是,如果数据库可移植性不重要,您可以使用CriteriaBuilder.function(...)来创建数据库本机函数。
对于MySQL,您的示例的order-by表达式将是:
Expression<String> replacedValue = criteriaBuilder.function("replace",
String.class, root.get("version"), criteriaBuilder.literal("."),
criteriaBuilder.literal(""));
Expression<String> lpadValue = criteriaBuilder.function("lpad",
String.class, replacedValue, criteriaBuilder.literal(20),
criteriaBuilder.literal("0"));
criteriaQuery.orderBy(criteriaBuilder.desc(lpadValue));
CriteriaBuilder.function(...)不支持cast(value as type) or convert(value, type)
等本机函数。所以使用lpad(...)来实现相同的orderBy结果。
它适用于Cmobilecom JPA,这是Java和Android的一个重量级JPA实现。
免责声明:我是Cmobilecom JPA的开发人员。