有人可以建议我如何使用“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的开发人员。