JPA 标准生成器:如何按顺序替换字符串并将其转换为数字?



有人可以建议我如何使用 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

还可以添加其他部分,例如用于替换的函数调用。

相关内容

  • 没有找到相关文章

最新更新