【问题标题】:Spring Data JPA: Find all by example and page and return DTO (Projection)Spring Data JPA:通过示例和页面查找所有内容并返回 DTO(投影)
【发布时间】:2020-06-07 16:57:38
【问题描述】:

我正在尝试将我的实体的所有数据查找为 EntityDTO。我知道如何将所有数据作为 DTO 查找,但我想使用 Example 对象放置一些过滤器并获取 Page 作为结果。

我在存储库中创建了一个方法:

Page<T> findBy(Example e, Pageable p, Class<T> type);

但是调用这个方法会报错

IllegalArgumentException: 至少提供了 1 个参数,但只有 0 个 查询中存在的参数。

这是完整的堆栈跟踪:

org.springframework.dao.InvalidDataAccessApiUsageException: At least 1 parameter(s) provided but only 0 parameter(s) present in query.; nested exception is java.lang.IllegalArgumentException: At least 1 parameter(s) provided but only 0 parameter(s) present in query.
org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:374)
org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:257)
org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:149)\r\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
com.sun.proxy.$Proxy132.findBy(Unknown Source)

【问题讨论】:

  • 1) 显示完整的堆栈跟踪。 2) 检查是否为参数e设置了任何属性。
  • @mentallurg 1) 我添加了完整的堆栈跟踪。 2)我正在使用示例,因为有时我会得到一些参数,但有时却没有。另外,我尝试在e 中添加一个参数,但我得到了相同的结果。而且,当我没有在e 中传递任何内容并使用带有Page&lt;Entity&gt; 的findAll 作为返回时,我会得到预期的结果。
  • 如果e 为空(null 或其所有属性为null),则不能使用示例搜索,因为没有没有示例。在这种情况下,您应该使用 findAll() 方法。
  • @mentallurg 正如我之前的评论中提到的,即使在设置属性值之后,我也会遇到同样的错误。看来我无法在 findBy 方法中传递示例。
  • 没错。这就是我的意思。如果 Example 为空,则无法按示例搜索。使用 findAll() - 不带参数或带分页参数,但当然不能将 Example 传递给 findAll()。

标签: java spring spring-data-jpa


【解决方案1】:

在 Spring 存储库接口中,查询是根据方法名称创建的。

请试试这个:

Page<T> findByExample(Example e, Pageable p, Class<T> type);

如果它不起作用,您可以在这里找到解决方案:

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 2018-03-05
    • 2020-09-22
    • 2021-06-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2019-01-07
    • 2021-08-28
    相关资源
    最近更新 更多