Java Query Builder API中如何拼接两个Expression<BigDecimal>?
解决JPA Criteria API中BigDecimal类型Expression的拼接问题
嘿,这个问题我之前在项目里也碰到过——JPA CriteriaBuilder的concat()方法确实只认Expression<String>类型,直接传BigDecimal的表达式肯定会报错。不过咱们可以先把BigDecimal类型的表达式转换成String类型,再进行拼接,这里有两种靠谱的实现方式:
方法一:用CriteriaBuilder的as()做通用类型转换
这是兼容性最好的方式,as()方法会根据你使用的数据库自动生成对应的类型转换SQL(比如MySQL的CAST、Oracle的TO_CHAR),不用操心数据库差异。
修改你的代码如下:
Expression<BigDecimal> one = root.get(ClassName_.decimalValue1); Expression<BigDecimal> two = root.get(ClassName_.decimalValue2); // 将BigDecimal表达式转换为String类型 Expression<String> oneStr = criteriaBuilder.as(one, String.class); Expression<String> twoStr = criteriaBuilder.as(two, String.class); // 拼接后执行in判断 Expression<String> concatenatedValue = criteriaBuilder.concat(oneStr, twoStr); predicatesList.add(criteriaBuilder.isTrue(concatenatedValue.in(array)));
方法二:结合数据库函数处理特殊格式需求
如果你的BigDecimal带有小数部分,而你需要去掉小数点再拼接(比如把123.45和67.89拼成123456789而不是123.4567.89),可以搭配数据库的REPLACE函数来处理:
Expression<String> oneStr = criteriaBuilder.function( "REPLACE", String.class, criteriaBuilder.as(one, String.class), criteriaBuilder.literal("."), criteriaBuilder.literal("") ); Expression<String> twoStr = criteriaBuilder.function( "REPLACE", String.class, criteriaBuilder.as(two, String.class), criteriaBuilder.literal("."), criteriaBuilder.literal("") ); Expression<String> concatenatedValue = criteriaBuilder.concat(oneStr, twoStr); predicatesList.add(criteriaBuilder.isTrue(concatenatedValue.in(array)));
注:"REPLACE"是主流数据库通用的函数名,如果你的数据库有特殊函数名,替换成对应名称即可。
小提醒
- 一定要保证拼接后的字符串格式和
array里的元素完全匹配,比如如果BigDecimal转String后带了末尾零(比如123.00转成"123.00"),但array里是"123",那匹配会失败,这时候可能需要额外做格式处理。 - 如果是固定格式的拼接需求,也可以考虑在实体类里用
@Formula注解定义一个计算属性,提前把两个BigDecimal拼接成字符串,这样在Criteria查询里直接调用这个属性就行,代码会更简洁。
内容的提问来源于stack exchange,提问作者user852
相关产品推荐
相关产品推荐

