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

Posted

技术标签:

【中文标题】使用 Spring 框架获取“未找到命名查询”【英文标题】:Getting 'Named query not found' with Spring framework 【发布时间】:2010-06-30 23:00:23 【问题描述】:

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

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

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

【问题讨论】:

你如何对它们进行单元测试?使用 spring JUnit 跑步者? Bozho,他正在使用 AbstractTransactionalJUnit4SpringContextTests 进行测试。 【参考方案1】:

确保您的实体已被映射/扫描。是用@Entity注解,是添加到persistence.xml还是相关的provider配置,还是自动扫描。

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

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

【讨论】:

Bozho: 1) 是的,我的实体用@Entity 注释。要点是只有一个查询没有被发现。其他都是。 2)在我的实际项目中,我将查询命名为常量,例如QUERY1。因此,当我在另一个类中调用一个查询时,它的形式为:MyEntity.QUERY1。所以,我仍然没有解决我的问题。还是谢谢你。 您的第三点在我编辑的问题描述中得到了回答。再次感谢您。 忘记了 persistence.xml。谢谢!【参考方案2】:

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

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

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

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

就是这样。谢谢博卓的帮助。

【讨论】:

以上是关于使用 Spring 框架获取“未找到命名查询”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring 框架从属性文件中获取值到 Map 中?

零基础学习-spring框架

MyBatis - Spring框架整合

SpringTest框架JUnit单元测试用例获取ApplicationContext实例的方法

Spring框架中获取连接池常用的四种方式

Spring框架IOC,DI概念理解