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

时间:2018-08-29 05:17:58

标签: java jpa spring-data-jpa criteria builder

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

1 个答案:

答案 0 :(得分:1)

当前,JPA没有用于replace()和cast(数字字符串)的API。但是,如果数据库的可移植性不是很关键,则可以使用CriteriaBuilder.function(...)创建数据库本机函数。

对于MySQL,示例的排序表达式为:

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