在尝试将QueryDSL实现应用于搜索过滤时,我遇到了以下问题,至少可以说是非常混乱。
考虑名为Payments的MongoDB集合中的以下属性:
对象1
- amountDue (Object)
- amount => 106.00 (String)
对象2
- amountDue (Object)
- amount => 58.80 (String)
这些值由系统生成,amountDue
对象的实际数据类型是org.joda.BigMoney对象。
这些属性应用于绑定方法,该方法用于提供QueryDSL谓词,以便返回任何amountDue.amount
属性大于搜索查询中指定的属性的Payment对象。这种方法描述如下:
@Override
public Predicate bind(NumberPath<BigDecimal> bigDecimalNumberPath, Collection<? extends BigDecimal> value) {
ArrayList<? extends BigDecimal> amounts = new ArrayList<>(value);
return bigDecimalNumberPath.gt(amounts.get(0));
}
下面介绍我正在测试的案例,其中包括各自的结果:
{URL}/payments/filter?page=0&amountDue.amount=10.00
,内部转换为'amountDue.amount&gt; 10.00'谓词返回两个对象[正确]
{URL}/payments/filter?page=0&amountDue.amount=20.00
,内部转换为'amountDue.amount&gt; 20.00'谓词仅返回对象2 [不正确]
{URL}/payments/filter?page=0&amountDue.amount=60.00
,内部转换为'amountDue.amount&gt; 60.00'谓词不返回对象[不正确]
{URL}/payments/filter?page=0&amountDue.amount=100.00
,内部转换为'amountDue.amount&gt; 100.00'谓词仅返回对象2 [不正确]
{URL}/payments/filter?page=0&amountDue.amount=150.00
,内部转换为'amountDue.amount&gt; 150.00'谓词仅返回对象2 [不正确]
当对象1的amount
值更改为小于100的值时,所有情况都会返回正确的结果。
您有什么建议/建议吗?
感谢您的时间!!
答案 0 :(得分:1)
以下内容已用于解决上述问题:
首先创建一个Decimal128(Bson Type)到Big Decimal类转换器:
public class Decimal128ToBigDecimalConverter implements Converter<Decimal128, BigDecimal> {
@Override
public BigDecimal convert(Decimal128 source) {
return source.bigDecimalValue();
}
}
然后创建一个Big Decimal到Decimal128(Bson Type)类转换器:
public class BigDecimalToDecimal128Converter implements Converter<BigDecimal, Decimal128> {
@Override
public Decimal128 convert(BigDecimal source) {
return new Decimal128(source);
}
}
最后,配置MongoConfig文件以使用转换器:
@Bean
public MongoTemplate mongoTemplate() throws Exception {
MongoTemplate mongoTemplate = new MongoTemplate(mongo(), getDatabaseName());
MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
mongoMapping.setCustomConversions(customConversions());
mongoMapping.afterPropertiesSet();
return mongoTemplate;
}
public CustomConversions customConversions() {
return new CustomConversions(Arrays.asList(new Decimal128ToBigDecimalConverter(), new BigDecimalToDecimal128Converter()));
}
/* (non-Javadoc)
* @see org.springframework.data.mongodb.config.AbstractMongoConfiguration#mongo()
*/
@Bean
@Override
public Mongo mongo() throws Exception
{
return new MongoClient();
}
该解决方案已按照此处列出的示例实施:http://ufasoli.blogspot.com.mt/2017/06/custom-converter-for-mongodb-and-spring.html