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