目前,JPA 没有replace() 和cast(string as numeric) 的API。但是,如果数据库可移植性并不重要,您可以使用 CriteriaBuilder.function(...) 创建数据库本机函数。
对于 MySQL,示例的 order-by 表达式为:
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 的开发人员。