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

如何在spring中使用@NamedQuery作为CrudRepository@Query?

邓英卓
2023-03-14

我想在一个JpaRepository中使用一个命名查询。但它不起作用:

public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {
    @Query(name = MyEntity.FIND_ALL_CUSTOM)
    List<MyEntity> findAllCustom(Pageable pageable);
}

@Entity
@NamedQuery(
    name = MyEntity.FIND_ALL_CUSTOM, query = "select * from MyEntity me where me.age >= 18"
)
public class MyEntity {
    public static final String FIND_ALL_CUSTOM = "findAllCustom";
}

结果:

org.springframework.data.mapping.PropertyReferenceException: No property findAllCustom found for type MyEntity!
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:75)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:270)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:241)
    at org.springframework.data.repository.query.parser.Part.<init>(Part.java:76)
    at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:235)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.buildTree(PartTree.java:373)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:353)
    at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:84)
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:61)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:94)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:205)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:72)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:369)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:192)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:239)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:225)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
    ... 28 more

更新:

public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {
    List<MyEntity> findAllCustom(Pageable pageable);
}

@Entity
@NamedQuery(
    name = "MyEntity.findAllCustom", query = "select * from MyEntity me where me.age >= 18"
)
public class MyEntity {

}

仍然相同的例外:

PropertyReferenceException: No property findAllCustom found for type MyEntity!

共有1个答案

邬友樵
2023-03-14

看看Spring Data JPA的留档-使用JPA NamedQueries。

我建议您遵循文档中设置的约定(从配置的域类的简单名称开始,然后是用点分隔的方法名称)。剪切下划线并将查询命名为

@NamedQuery(name = "MyEntity.findAllCustom", query="...")

或者最好加一个暗示性的名字,比如findByAge或其他什么。

要允许执行这些命名查询,您需要做的就是指定MyEntityRepository,如下所示:

public interface MyEntityRepository extends JpaRepository <MyEntity, Long> {
    List<MyEntity> findAllCustom();
}

我使用JpaRepository实现了它,正如留档示例所示。但是您可以尝试使用一个简单的CrudRepository,看看它是否有效。

我认为问题在于您在哪里使用@Query并且注释到查询方法的查询将优先于使用@NamedQuery定义的查询。阅读@Query用法的文档,我认为您在哪里也使用错了。

要应用分页,必须派生第二个子查询。由于子查询引用的是相同的字段,因此需要确保查询对其引用的实体/表使用别名

这意味着您将从MyEntity me where me.age重写查询,如

示例用于@Query,但这也是一个命名查询,因此它也应该适用于您的案例。唯一的区别是使用@Query您实际上直接绑定它们,而不是将它们注释到域类。

更新2

我在自己的应用程序中进行了尝试。首先,您应该使用别名而不是*(即me)进行查询。其次,您使用的字符串FIND\u ALL\u CUSTOM不符合约定,即“MyEntity.findAllCustom”。

复制粘贴此:

public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {
    List<MyEntity> findAllCustom(Pageable pageable);
    List<MyEntity> findAllCustom();
}

@Entity
@NamedQuery(
    name = MyEntity.FIND_ALL_CUSTOM, query = "select me from MyEntity me where me.age >= 18"
)
public class MyEntity {
    public static final String FIND_ALL_CUSTOM = "MyEntity.findAllCustom";
}

两者都可以。对于具有可分页方法参数的方法,将其称为myEntityRepository.allCustom(new PageRequest(0,20))。Ofc,您知道注入了myEntityRepository

 类似资料:
  • 问题内容: 我想在haversine公式的查询下运行为NamedQuery,但我不知道如何纠正它。 我将查询运行到mysql中,对我来说很好用,但是当我将以下查询写为NamedQuery时,它给了我错误: 例外: 谁能帮助我,告诉我这是怎么回事? 问题答案: 终于能够找到解决方案。我使用createNativeQuery代替createQuery,它解决了我的问题。

  • 问题内容: 我想利用spring-data-jpa和。但是我无法自动接线。(同一包中的所有其他服务均已正确接线): 结果: 由以下原因引起:org.springframework.beans.factory.BeanCreationException:创建名称为’userService’的bean时出错:注入资源依赖项失败;嵌套的异常是org.springframework.beans.facto

  • 我想使用spring-data-jpa和。但我无法得到它。(同一包中的所有其他服务都已正确连接): 结果: 由:org.springframework.beans.factory.BeanCreationException引起:创建名为“用户服务”的bean时出错:注入资源依赖项失败;嵌套异常是org.springframework.beans.factory.nosuchBeanDefiniti

  • 我不能使用spring boot 2.1.0.M4和Junit5和测试我的spring crud存储库。我正在使用下面的spring crud存储库接口。 这是我的单元测试类 这是我的pom.xml 我只想知道成功运行测试的正确注释集是什么。我尝试使用不同的组合 如果我只是使用@datajpatest和@runwith(Springrunner.class),我会得到以下错误: 附言。只想提一下,

  • 原因:org.springframework.beans.factory.BeanCreationException:创建名为“example repository”的bean时出错:调用init方法失败;嵌套异常为java.lang.IllegalArgumentException:无法创建查询方法公共抽象类型找不到属性限制 如何向方法添加作为参数传递的限制?

  • 首先是类,我在其中向筛选器添加路径。请注意带有“”的行,这是我尝试自动连接的类: 和类。我写了一些不相关的代码: 在调用时,中的将始终返回Null。 现在管用了。 使用 并将其注入WebSecurityConfig 在移除 在JWTLoginFilter中的构造函数中