JPA 标准生成器:如何按顺序将字符串替换并转换为数字?

JPA criteria builder: how to replace and cast a string to numeric in order-by?

有人可以建议我如何使用 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”等值 我们需要 trim 个字符 '.'在版本中,然后将它们转换为数字,然后按描述排序。

目前 JPA 没有用于 replace() 和 cast(string as numeric) 的 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 的开发人员。