使用Spring框架获取"找不到命名查询"

Fel*_*les 5 java spring jpa named-query

我有一个带有一组命名查询的Java类(实体).当Spring尝试注入相关的bean时,它没有找到其中一个查询.

例如:

@NamedQueries({
        @NamedQuery(name = "Query1", query = "..."),
        @NamedQuery(name = "Query2", query = "..."),
        @NamedQuery(name = "Query3", query = "..."),
        @NamedQuery(name = "Query4", query = "..."),
        @NamedQuery(name = "Query5", query = "...")
})
Run Code Online (Sandbox Code Playgroud)

当Spring尝试注入bean时,我得到:

org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'myBean': Injection of resource methods failed;nested exception is
java.lang.IllegalArgumentException: Named query not found: Query3 at ...
Run Code Online (Sandbox Code Playgroud)

我确定查询是正确的(它们的所有单元测试都在通过).

有人知道它的根本原因吗?

Boz*_*zho 5

  • 确保您的实体已被映射/扫描.是注释@Entity,是添加到persistence.xml相关的提供程序配置,还是自动扫描.

  • 我前缀类的名称来查询-即MyEntity.Query1,MyEntity.Query1等等.

  • 验证是否没有部署错误 - 即您的查询是否正确


Fel*_*les 2

好吧,我\xc2\xb4ve 得到了错误。发生的事情如下:

\n\n

在我的类中,有一个用 @Resource 注释的方法,它调用在另一个用 @Entity 注释的类中声明的命名查询。

\n\n

因此,当 Spring 注入并运行该方法时,它会尝试使用命名查询。但是,该查询尚未“准备好”使用,并且引发的异常是未找到该查询。

\n\n

为了解决这个问题,我必须运行一个在Spring注入完成时调用的不同方法,即我的类必须实现接口org.springframework.context.ApplicationListener,并且方法onApplicationEvent等待org.springframework.context.event。 ContextRefreshedEvent 事件。

\n\n

那\xc2\xb4都是家伙。谢谢博佐的帮助。

\n