当前位置:网站首页>关于MongoDb查询Decimal128转BigDecimal问题
关于MongoDb查询Decimal128转BigDecimal问题
2022-08-10 05:47:00 【chw-di】
前提:使用MongoTemplate查询数据库,返回结果类型为Map
Decimal128是无法转换BigDecimal的,除非你的返回类型中定义了对象中的类型为BigDecimal,那如果无法确定返回值是什么的情况下只能用Map去接返回结束。
解决方法:
可以使用jackson对Decimal128进行转换BigDecimal
我使用的第二种方法:
改源码。
MappingMongoConverter中的getPotentiallyConvertedSimpleRead方法
Checks whether we have a custom conversion for the given simple object. Converts the given value if so, applies {@link Enum} handling or returns the value as is. Can be overridden by subclasses.
检查给定的简单对象是否有自定义转换。如果是,则转换给定值,并应用
private Object getPotentiallyConvertedSimpleRead(Object value, @Nullable Class<?> target) {
if (target==null){
return value;
}
//对Decimal128转换为BigDecimal
if (value.getClass() == Decimal128.class){
return ((Decimal128) value).bigDecimalValue();
}
if (ClassUtils.isAssignableValue(target, value)) {
return value;
}
if (conversions.hasCustomReadTarget(value.getClass(), target)) {
return doConvert(value, target);
}
if (Enum.class.isAssignableFrom(target)) {
return Enum.valueOf((Class<Enum>) target, value.toString());
}
return doConvert(value, target);
}
左边是未修改的代码,因为我是使用Map接的结果,所以类型都是Object,而在还没有检查是否有自定义转换的时候就出现了误区,因为在之前先调用了ClassUtils.isAssignableValue方法
来自ClassUtils.java
public static boolean isAssignableValue(Class<?> type, @Nullable Object value) {
Assert.notNull(type, "Type must not be null");
return (value != null ? isAssignable(type, value.getClass()) : !type.isPrimitive());
}
Determine if the given type is assignable from the given value, assuming setting by reflection.
确定给定的类型是否可以从给定的值赋值,假设由反射设置。认为原始封装类可赋值给相应的原始类型。
所以右边的代码改为只要value是Decimal128就去强转调取Decimal128的bigDecimalValue()
BigDecimal转Decimal128很简单,写一个配置类,并让MongoTemplate去加载即可,
@ReadingConverter
public class BigDecimalToDecimal128Converter implements Converter<BigDecimal, Decimal128> {
@Override
public Decimal128 convert(BigDecimal bigDecimal) {
return new Decimal128(bigDecimal);
}
}
private static MongoConverter getDefaultMongoConverter(MongoDatabaseFactory factory) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
//增加对BigDecimalToDecimal28的转换
List<Object> list = new ArrayList<>();
list.add(new BigDecimalToDecimal128Converter());
MongoCustomConversions conversions = new MongoCustomConversions(list);
MongoMappingContext mappingContext = new MongoMappingContext();
mappingContext.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
mappingContext.afterPropertiesSet();
MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mappingContext);
converter.setCustomConversions(conversions);
converter.setCodecRegistryProvider(factory);
converter.afterPropertiesSet();
return converter;
}
数据库:
返回结果:
边栏推荐
猜你喜欢
全网可达,实现备份
全网可达,交换机和路由器的配置,vlan
Talking about 3 common shadow rendering techniques in games (2): shadow cone
R language cluster analysis - code analysis
浅谈游戏中3种常用阴影渲染技术(3):阴影贴图
unity在UI界面上展示旋转模型
强化学习_03_表格方法实践(CartPole-v0 And MontoCarlo)
Unity plug-in DOTween User Guide 2 (Brief explanation of Bezier curves)
Myunity框架笔记2
ACPI知识(高级配置和电源接口)
随机推荐
OpenGL学习笔记(LearnOpenGL)-第二部分 绘制三角形
markdown类图学习
21天学习挑战赛--分班
Ingress Controller performance test(1)
Analysis of minix_super_block.s_ninodes of mkfs.minix.c
tqdm高级使用方法(类keras进度条)
内核映像文件格式
进制的前缀表示和后缀表示
MySQL笔记
unity瓦片地图调整图片大小
数据库学习之数据类型
椭圆曲线离散对数问题以及求解
强化学习_07_DataWhale深度Q网络进阶技巧
Two-dimensional cartoon rendering - coloring
新手使用 go channel 需要注意的问题
Unity导航与寻路系统的基本使用
unity箭头控制物体移动
UnityShader入门精要-渲染纹理 镜子 玻璃 效果
Parallax Mapping: More Realistic Texture Detail Representation (Part 1): Why Use Parallax Mapping
数据库学习之表的约束