使用 Spring ExampleMatcher 处理数字

Gui*_*ume 5 primitive jpa numbers spring-mvc query-by-example

我是 Java 和 Spring 的新手,我正在使用 Spring JPA 构建系统。我现在正在处理我的服务和控制器类,我想创建一个动态查询。我创建了一个表单,用户可以在其中在字段中输入值,或将它们留空。然后我使用示例匹配器创建一个基于非空字段和数据库中匹配对象的非空字段的查询对象的示例。

它与字符串一起工作正常,并且可以与数字一起工作,以防用户输入的数字与数据库中的数字匹配。我想问社区的是:我们如何使用 Spring ExampleMatcher 添加逻辑,以便与数字相关的查询不是 Select * from Projects where project.return = 10 而是例如 Select * from Projects where project.return >=10?

这是一个非常基本的问题,但我在网上到处找,都找不到答案。我发现的所有消息来源都说 ExampleMatcher 只处理字符串,但我觉得奇怪的是,如此强大的系统没有处理高于/低于数字类型标准的逻辑。

我的示例匹配器代码:

    ExampleMatcher matcher = ExampleMatcher.matching()
            .withIgnoreNullValues()
            .withIgnoreCase()
            .withIgnorePaths("projectId", "businessPlans", "projectReturn", "projectAddress.addressId")
Run Code Online (Sandbox Code Playgroud)

我想添加如下内容:

.withMatcher("projectAmountRaised", IsMoreThan(Long.parseLong()));
Run Code Online (Sandbox Code Playgroud)

我本来想拥有的,但它已被弃用:

public static List getStockDailyRecordCriteria(Date startDate,Date endDate,
        Long volume,Session session){

Criteria criteria = session.createCriteria(StockDailyRecord.class);
if(startDate!=null){
        criteria.add(Expression.ge("date",startDate));
}
if(endDate!=null){
        criteria.add(Expression.le("date",endDate));
}
if(volume!=null){
        criteria.add(Expression.ge("volume",volume));
}
criteria.addOrder(Order.asc("date"));

return criteria.list();
  }
Run Code Online (Sandbox Code Playgroud)

因此,我正在寻找类似的东西......我可以使用 ExampleMatcher 从仅字符串标准创建一个广泛的结果列表,然后编写我自己的逻辑来删除不符合数字标准的对象,但我相信有一种更优雅的方法.

非常感谢您的帮助,也感谢您的放纵!

Vad*_*4uk 0

您可以通过以下方式使用 QBE 和可分页以及附加过滤器:

ExampleMatcher matcher = UntypedExampleMatcher.matching()
    .withIgnoreCase()
    .withIgnorePaths("startDate"); 

MyDao probe = new MyDao()

final Example<MyDao> example = Example.of(probe, matcher);
Query q = new Query(new Criteria().alike(example)).with(pageable);
q.addCriteria(Criteria.where("startDate").gte(probe.getStartDate()));

List<MyDao> list = mongoTemplate.find(q, example.getProbeType(), "COLLECTION_NAME");
PageableExecutionUtils.getPage(list, pageable, () -> mongoTemplate.count(q, example.getProbeType(), "COLLECTION_NAME"));
Run Code Online (Sandbox Code Playgroud)