有人可以建议我如何使用“JPA标准”构建器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,示例的排序表达式为:

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

10-05 21:55