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

时间:2010-06-30 23:00:23

标签: 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 = "...")
})

当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 ...

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

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

2 个答案:

答案 0 :(得分:5)

  • 确保您的实体已被映射/扫描。是否使用@Entity进行了注释,是将其添加到persistence.xml还是相关的提供商配置,还是自动扫描。

  • 我将该类的名称作为查询的前缀 - 即MyEntity.Query1MyEntity.Query1等。

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

答案 1 :(得分:2)

好吧,我收到了错误。发生的事情如下:

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

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

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

那是所有人。谢谢Bozho的帮助。