使用实体管理器时,没有为该名称定义查询

Posted

技术标签:

【中文标题】使用实体管理器时,没有为该名称定义查询【英文标题】:No Query defined for that name, when using Entity Manager 【发布时间】:2015-01-23 07:43:06 【问题描述】:

我有以下实体:

package com.server.models;
@Entity
@Table(name="users")
@NamedQueries(
    @NamedQuery(name=User.QUERY_FIND_USER,query="SELECT c FROM user c WHERE c.username = :username")
)
public class User 

    public static final String QUERY_FIND_USER = "LoginFindUser";
    //  ...

然后使用实体管理器 (em) 我正在执行以下操作:

package com.server.controllers;
@Service
@Transactional
@RestController
@RequestMapping("/user")
public class LoginController 
    @PersistenceContext
    private EntityManager em;
 // my code
    TypedQuery<User> queries = em.createNamedQuery(User.QUERY_FIND_USER,User.class).setParameter("username", username);
    List<User> users = queries.getResultList();

但是我收到以下错误:

java.lang.IllegalArgumentException: No query defined for that name [LoginFindUser]

这是我的 spring-boot 配置。这应该包括实体的扫描。

package com.server.boot;

@Configuration
@ComponentScan("com.server")
@EnableAutoConfiguration
public class Starter 
    public static void main(String[] args)
        SpringApplication.run(Starter.class,args);
        System.out.println("started application");
    

    @Bean
    public LoginController loginController()
        return new LoginController();
    

    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) 
         HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
         factory.setEntityManagerFactory(emf);
         return factory;
    


【问题讨论】:

将一个简单的字符串作为名称是否有效?如果是,可能是一些评估时差 然后检查User实体是否定义在你的持久化单元中。 我使用的是 spring-boot,所以持久性是自动定义的。上下文扫描应该包括它 将配置添加到问题中 顺便说一句,如果实体被映射,你会得到一个异常,因为查询是无效的。用户!= 用户。 【参考方案1】:

你可以通过下面的配置来做。

private static final String[] ENTITYMANAGER_PACKAGES_TO_SCAN =  "a.b.c.entity" ;

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() 

    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactoryBean.setJpaVendorAdapter(vendorAdaptor());
    entityManagerFactoryBean.setDataSource(dataSource());
    entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
    entityManagerFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);
    entityManagerFactoryBean.setJpaProperties(jpaHibernateProperties());

    return entityManagerFactoryBean;

【讨论】:

【参考方案2】:

添加

entitymanager.packagesToScan:com.server.models

到您的 application.properties 文件。

【讨论】:

【参考方案3】:

您可以使用如下所示的这段代码sn-p。

<property name="packagesToScan" value="com.servers.model" />

【讨论】:

【参考方案4】:

好的,这可能是您的持久性配置的问题。如果您的模型定义都在单独的 ejb 中,请确保将它们添加到 persistence-unit 中的 persistence.xml

【讨论】:

【参考方案5】:

找到了。感谢cmets里的小伙伴们

添加

@EntityScan("com.server.models")

到你的配置类

我在查询中遇到错误,因为 user 必须是 User

【讨论】:

持久化是什么版本有这个注解? 如果您使用旧的 dispatcher-servlet.xml

以上是关于使用实体管理器时,没有为该名称定义查询的主要内容,如果未能解决你的问题,请参考以下文章

使用ubuntu刷新软件源 和 新利得软件管理器时提示没有公钥!!如何解决?

Core Data 无法生成原始访问器

为啥任务管理器进程中没有“.exe”

使用屏幕管理器时不显示相机图像

如何在 webflux 中实现自定义身份验证管理器时对未经授权的请求响应自定义 json 正文

JPA,实体管理器,选择多列并获取结果列表自定义对象