JPA条件构建器:如何在顺序中将字符串替换并转换为数字?

问题描述 投票:1回答:1

有人可以建议我如何使用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排序。

java jpa spring-data-jpa criteria builder
1个回答
1
投票

目前,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的开发人员。

© www.soinside.com 2019 - 2024. All rights reserved.