【问题标题】:Spring boot Mongo Data org.springframework.data.mapping.context.InvalidPersistentPropertyPathSpring Boot Mongo Data org.springframework.data.mapping.context.InvalidPersistentPropertyPath
【发布时间】:2021-03-16 14:43:00
【问题描述】:

我想获取带有日期的数据。

请勿阅读此内容

“是否可以使用 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]

【问题讨论】:

    标签: java spring mongodb spring-boot spring-data


    【解决方案1】:

    您可以使用以下方法按每月的某天查询集合。并且,存储库查询如下:

    @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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-18
      • 2021-10-05
      • 2021-11-17
      • 2017-08-31
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多