Spring 如何在JPA中创建日期规范以查找较大/较小的日期等?
我有一个Maria数据库,其中一个表的列名为Spring 如何在JPA中创建日期规范以查找较大/较小的日期等?,spring,database,jpa,Spring,Database,Jpa,我有一个Maria数据库,其中一个表的列名为registed什么是时间戳。我想制定规范,查找日期之前/之后的记录。我有这个: 公共类GreaterThanDate实现规范{ 私人临时搜索标准; public GreaterThanDate(SearchCriteria SearchCriteria){ 标准=搜索标准; } @凌驾 公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder){ 试一试{ SimpleDataFormat格式化程序=新的S
registed
什么是时间戳。我想制定规范,查找日期之前/之后的记录。我有这个:
公共类GreaterThanDate实现规范{
私人临时搜索标准;
public GreaterThanDate(SearchCriteria SearchCriteria){
标准=搜索标准;
}
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder){
试一试{
SimpleDataFormat格式化程序=新的SimpleDataFormat(“yyyy-MM-dd'HH:MM:ss.SSSXXX”);
返回builder.greaterThanOrEqualTo(root.get(criteria.getKey()),formatter.parse(criteria.getValue().toString());
}捕获(解析异常){
System.out.println(e.getMessage());
}
}
}
公共类搜索标准{
私钥;
私人客体价值;
}
这是在我的数据库中找到的日期:2020-09-01 08:00:00.000000
。如果我试图找到这些记录,我会得到一个java.lang.IllegalArgumentException
。我这样称呼它:
SearchCriteria=newsearchCriteria(“已注册”,“2020-09-01 08:00:00.000000”);
GreaterThanDate规范=新的GreaterThanDate(标准);
findAll(规范,可分页);
异常为java.lang.IllegalArgumentException:无效筛选器
参数。在sun.reflect.NativeMethodAccessorImpl.invoke0(本机
方法)在sun.reflect.NativeMethodAccessorImpl.invoke(未知
源)位于sun.reflect.DelegatingMethodAccessorImpl.invoke(未知
位于java.lang.reflect.Method.invoke(未知源代码)的
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
在
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
在
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
在
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)
在
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)
在
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
在
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
在
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
在
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
在
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
在
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
在
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在
org.springframework.web.filter.AbstractRequestLoggingFilter.doFilterInternal(AbstractRequestLoggingFilter.java:289)
在
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
在
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在
org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
在
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
在
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在
org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
在
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
在
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在
org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93)
在
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
在
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
在
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
在
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
在
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
在
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
在
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
在
org.apache.catalina.valves.ErrorReportValve。
@Entity
public class User {
private ZonedDateTime registered;
}
} 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;
}