有人可以建议我如何使用 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配合得很好,Cmobilecom JPA是Java和Android的超量级JPA实现。
免责声明:我是Cmobilecom JPA的开发人员。
我不知道哪个 JPA 版本引入了这个,但我使用的是 Hibernate 6/JPA 3.1.0,标准生成器具有导致 SQL 转换的 toX(( 方法。
cq.orderBy(cb.desc(cb.toInteger(root.get("version"))))
应该导致以下结果(对于 SQL Server(:
order by cast(version as int) desc
还可以添加其他部分,例如用于替换的函数调用。