当前位置: 首页 > 知识库问答 >
问题:

如何为JPA中的日期创建一个规范,以查找更大/更小等?

陆翰藻
2023-03-14

我有一个Maria数据库,其中有一个表,列名为registrated(时间戳)。我想做的规范,以找到记录之前/之后的日期。我有这个:

public class GreaterThanDate implements Specification<User> {
    
    private transient SearchCriteria criteria;
    
    public GreaterThanDate(SearchCriteria searchCriteria) {
        criteria = searchCriteria;
    }
    
    @Override
    public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
            return builder.greaterThanOrEqualTo(root.<Date>get(criteria.getKey()), formatter.parse(criteria.getValue().toString()));
            } catch (ParseException e) {
            System.out.println(e.getMessage());
        }
    }
}

public class SearchCriteria {
    private String key;
    private Object value;
}

这是在我的数据库中找到的日期:2020-09-01 08:00:00000000。如果我尝试查找记录,我会得到java.lang.IllegalArgumentException。我是这样称呼它的:

SearchCriteria criteria = new SearchCriteria("registered", "2020-09-01 08:00:00.000000");
GreaterThanDate specification = new GreaterThanDate(criteria);
userRepository.findAll(specification, pageable);
@Entity
public class User {
    private ZonedDateTime registered;
}

null

共有1个答案

云育
2023-03-14

您的代码有几个问题。

>

  • 您的实体类的字段类型为java.time.ZonedDateTime。但是您正在尝试使用simpledateformat进行解析,它是为旧的java.util.date设计的。请使用DateTimeFormatter来分析注册的ZonedDateTime私有ZonedDateTime;

    日期格式yyyy-mm-dd't'hh:mm:ss.sssxxx与输入日期2020-09-01 08:00000000不匹配,因此无法使用此格式分析日期。您将获得ParseException

    不要隐藏异常。您在问题上发布的异常可能是由于其他错误引起的。

     } catch (ParseException e) {
                System.out.println(e.getMessage());
            }
    

    请参阅此工作示例并执行类似操作以解决问题:

    package stackoverflowdatespec
    
    import lombok.*;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.event.ContextRefreshedEvent;
    import org.springframework.context.event.EventListener;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.jpa.domain.Specification;
    import org.springframework.data.jpa.repository.support.JpaRepositoryImplementation;
    import org.springframework.stereotype.Component;
    
    import javax.persistence.*;
    import javax.persistence.criteria.*;
    import java.time.ZonedDateTime;
    import java.time.format.DateTimeFormatter;
    
    @SpringBootApplication
    public class StackOverFlowDateSpecApp {
        public static void main(String[] args) {
            SpringApplication.run(StackOverFlowDateSpecApp.class, args);
        }
    }
    
    @Entity
    @Data
    @ToString
    class A {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        protected Long id;
    
        private ZonedDateTime registered = ZonedDateTime.now();
    }
    
    interface ARepo extends JpaRepositoryImplementation<A, Long> {
    }
    
    @Component
    @RequiredArgsConstructor
    class Init {
        final ARepo repo;
        @EventListener
        public void init(ContextRefreshedEvent evt) {
            repo.save(new A());
            System.out.println(repo.findAll());
    
            SearchCriteria criteria = new SearchCriteria("registered", "2011-12-03T10:15:30+01:00");
            System.out.println(repo.findAll(new GreaterThanDate(criteria), Pageable.unpaged()).getContent());
        }
    }
    
    @RequiredArgsConstructor
    class GreaterThanDate implements Specification<A> {
        private final SearchCriteria criteria;
        @Override
        public Predicate toPredicate(Root<A> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder builder) {
            ZonedDateTime before = ZonedDateTime.parse(criteria.getValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX"));
            return builder.greaterThanOrEqualTo(root.get(criteria.getKey()), before);
    
        }
    }
    
    @Data
    @AllArgsConstructor
    class SearchCriteria {
        private String key;
        private String value;
    }
    

  •  类似资料:
    • 本文向大家介绍如何在MySQL中创建和更新表的日期?,包括了如何在MySQL中创建和更新表的日期?的使用技巧和注意事项,需要的朋友参考一下 使用MySQL中的create_time或update_time获取创建和更新表的确切日期。 首先,使用SHOW命令。语法如下 我们正在考虑我们的数据库“ test3”,该数据库已经有一些表 现在使用以下查询显示数据库test3中的所有表 以下是输出 查询如下

    • 我试图创建一个数据流作业每天运行与云调度器。我需要使用get请求从外部API获取数据,所以我需要当前日期作为输入。但是,当我将数据流作业导出为计划模板时,日期输入将停留在执行时,而不是每天更新。我一直在寻找一个解决方案,遇到了ValueProvider,但是我的管道用语句总是在没有指定ValueProvider时返回错误'runtimeValueProvider(选项:test,type:str,

    • 问题内容: 我需要检索一份雇员列表,并为每位雇员列出他们在给定年度内积极参与福利保障的几个月的清单。有一个包含工作数据的表和一个包含福利信息的表。还有一个交付日期表,该表列出了2007-2018年的每个日期,并针对每个日期显示月,日和日历年。 我现在编写查询的方式是说:在日期表中找到提示年份的01/01到12/31之间的所有日期(或当前日期,以较早的日期为准),2)员工在福利表上活跃的时间。对于每

    • 我有下面的查询,其中两个表连接在非主列上。该表连接到一个公用列上。 用户详细信息 如何在JPA规范中实现相同的查询

    • 问题内容: 如何通过Python更改Windows文件的文件创建日期? 问题答案: the牛为胜利而刮胡子。

    • 问题内容: 可能是这样的: 但是可能存在更简单的方法吗?谢谢。 问题答案: 您走在正确的轨道上。 让我仅在星期一进行这项工作。