5

我有一个带有一组命名查询的 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 ...

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

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

4

2 回答 2

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

  • 我会在查询前面加上类的名称 - 即MyEntity.Query1MyEntity.Query1

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

于 2010-07-01T05:44:32.577 回答
2

好吧,我有错误。发生的事情如下:

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

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

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

这就是所有的家伙。谢谢博卓的帮助。

于 2010-07-02T18:50:51.010 回答