当前位置:网站首页>关于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;
}
数据库:
返回结果:
边栏推荐
猜你喜欢
随机推荐
Win32屏幕坐标转换Qt坐标
Introduction to KDE Framework
Qt列表下方增加弹出加载数据提示效果
动态规划、背包问题 6/23 101-105
请问一下。Oracle CDC 连接器支持 LogMiner 和 XStream API 两种方式捕
强化学习_07_DataWhale深度Q网络进阶技巧
ebp/栈帧/call stack
Unity导航与寻路系统的基本使用
指纹浏览器在使用易路代理时常见的问题及解决办法
Explore the origin of the garbled problem: the association between GBK, UTF8, UTF16, UTF8BOM, and ASN1
QEMU guest与host通过网络通信——bridge/hostfwd/guestfwd
Unity plug-in DOTween User Guide 2 (Brief explanation of Bezier curves)
直接跳转与间接跳转
Qt滚动条(QScrollBar)圆角样式问题跟踪
UnityShader入门精要-高级光照基础
Talking about 3 common shadow rendering techniques in games (1): plane shadow
优化Mysql运行OrderBy性能
Unity瓦片地图取消部分刚体效果
BUUCTF笔记(web)
各位大佬 oracle cdc 默认配置 偶发会30秒才抓取到数据 这个怎么优化啊