使用实体管理器时,没有为该名称定义查询
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
【讨论】:
持久化是什么版本有这个注解? 或以上是关于使用实体管理器时,没有为该名称定义查询的主要内容,如果未能解决你的问题,请参考以下文章
使用ubuntu刷新软件源 和 新利得软件管理器时提示没有公钥!!如何解决?