首页 > 解决方案 > Spring Boot Mongo Data org.springframework.data.mapping.context.InvalidPersistentPropertyPath

问题描述

我想用日期获取我的数据。

不要读这个

“是否可以使用 LocalDateTime 类查询数据?我真的没有什么要添加的,但 StackOverflow 告诉我我的问题是所有代码,所以我要添加这个。不过,Stackoverflow 告诉我我的问题主要是代码所以我只是在重复自己。我的问题是不言自明的,我真的不知道我还应该补充什么”

不要读这个

POJO:

@Getter
@Setter
@Document(collection = "matches")
public class Match {

    @Id
    private long id;
    private String matchName;
    private LocalDateTime date;

    public static final String SEQUENCE_NAME = "matches";

}

存储库:

@Repository
public interface MatchRepository extends MongoRepository<Match,Long> {

    Page<Match> findAllByDate_DayOfMonth(int date_dayOfYear, Pageable pageable);
}

服务:

@Override
public Page<Match> findTodayMatches(int count, int page) {
    int mPage = page != 0 ? page - 1: 0;
    Pageable pageable = PageRequest.of(mPage, count, Sort.by("date").ascending());
    return matchRepository.findAllByDate_DayOfMonth(LocalDateTime.now().getDayOfMonth(),pageable);
}

错误:

    WARNING: An illegal reflective access operation has occurred
    WARNING: Illegal reflective access by org.springframework.util.ReflectionUtils (file:/C:/Users/ME/.m2/repository/org/springframework/spring-core/5.3.1/spring-core-5.3.1.jar) to constructor java.time.LocalDateTime(java.time.LocalDate,java.time.LocalTime)
    WARNING: Please consider reporting this to the maintainers of org.springframework.util.ReflectionUtils
    WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
    WARNING: All illegal access operations will be denied in a future release
    2020-12-04 17:48:29.284 ERROR 13300 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.mapping.context.InvalidPersistentPropertyPath: No property 'dayOfMonth' found on class java.time.LocalDateTime! Did you mean: ?] with root cause
    
org.springframework.data.mapping.context.InvalidPersistentPropertyPath: No property 'dayOfMonth' found on class java.time.LocalDateTime! Did you mean: ?
    at org.springframework.data.mapping.context.PersistentPropertyPathFactory.createPersistentPropertyPath(PersistentPropertyPathFactory.java:205) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.data.mapping.context.PersistentPropertyPathFactory.lambda$getPersistentPropertyPath$1(PersistentPropertyPathFactory.java:172) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at java.base/java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:330) ~[na:na]
    at org.springframework.data.mapping.context.PersistentPropertyPathFactory.getPersistentPropertyPath(PersistentPropertyPathFactory.java:171) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.data.mapping.context.PersistentPropertyPathFactory.from(PersistentPropertyPathFactory.java:86) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.data.mapping.context.PersistentPropertyPathFactory.from(PersistentPropertyPathFactory.java:99) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:286) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.data.mongodb.repository.query.MongoQueryCreator.create(MongoQueryCreator.java:118) ~[spring-data-mongodb-3.1.1.jar:3.1.1]
    at org.springframework.data.mongodb.repository.query.MongoQueryCreator.create(MongoQueryCreator.java:65) ~[spring-data-mongodb-3.1.1.jar:3.1.1]
    at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:119) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:95) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:81) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.data.mongodb.repository.query.PartTreeMongoQuery.createQuery(PartTreeMongoQuery.java:89) ~[spring-data-mongodb-3.1.1.jar:3.1.1]
    at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.doExecute(AbstractMongoQuery.java:122) ~[spring-data-mongodb-3.1.1.jar:3.1.1]
    at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.execute(AbstractMongoQuery.java:107) ~[spring-data-mongodb-3.1.1.jar:3.1.1]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:152) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:131) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.1.jar:5.3.1]
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) ~[spring-data-commons-2.4.1.jar:2.4.1]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.1.jar:5.3.1]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.1.jar:5.3.1]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.1.jar:5.3.1]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.1.jar:5.3.1]
    at com.sun.proxy.$Proxy95.findAllByDate_DayOfMonth(Unknown Source) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.3.1.jar:5.3.1]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.3.1.jar:5.3.1]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.1.jar:5.3.1]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.1.jar:5.3.1]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.1.jar:5.3.1]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.1.jar:5.3.1]
    at com.sun.proxy.$Proxy95.findAllByDate_DayOfMonth(Unknown Source) ~[na:na]

标签: javaspringmongodbspring-bootspring-data

解决方案


您可以使用以下命令按日期查询集合。并且,存储库查询如下:

@Query("{ $expr: { $eq: [ { $dayOfMonth: '$date' }, ?0 ] } }")
List<Match> findAllByDayOfMonth(int dayOfMonth);

该代码repo.findAllByDayOfMonth(4)返回数据库中具有date字段值的所有文档,例如ISODate("2020-12-04T08:50:00Z")ISODate("2019-04-04T09:45:00Z")

另一种方法是实现存储库方法(在存储库实现类中)。但是,上述解决方案更简单、更清晰。

您得到的异常是org.springframework.data.mapping.context.InvalidPersistentPropertyPath“异常表明源路径无法完全解析为 PersistentPropertyPath。”。 java.time.LocalDateTime确实有getDayOfMonth()方法。但是,我不知道您是否可以按照您想要的方式使用 JDK API 类方法。

我尝试过的代码是 Spring Boot v2.4 和 MongoDB v4.2.8。


推荐阅读