Hibernate 此位置不允许使用查询批注

Hibernate 此位置不允许使用查询批注,hibernate,spring-boot,spring-data-jpa,Hibernate,Spring Boot,Spring Data Jpa,新春 正在尝试使用@Query批注,但收到以下消息: 此位置不允许使用批注@Query 我缺少一些设置或配置,以下是我所拥有的: pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</versio

新春

正在尝试使用@Query批注,但收到以下消息: 此位置不允许使用批注@Query

我缺少一些设置或配置,以下是我所拥有的:

pom.xml

<parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>1.5.2.RELEASE</version>
 <relativePath/>
</parent>
… to dependency:
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>      
</dependency>

我的问题是我缺少什么设置信息?

您的存储库包是否映射到配置类

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {
        "br.com.example.repository"}, entityManagerFactoryRef = "exampleEntityManager", transactionManagerRef = "exampleTransactionManager")
public class ExampleDataSourceConfig {

    @Primary
    @Bean(name = "exampleEntityManager")
    public LocalContainerEntityManagerFactoryBean exampleEntityManager() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(exampleDataSource());
        em.setPackagesToScan(new String[] { 
                "br.com.example.domain"});

        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        final HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", "validate");
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");      
        em.setPersistenceUnitName("examplePU");
        em.setJpaPropertyMap(properties);
        return em;
    }

    public DataSource exampleDataSource() {
        JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
        DataSource dataSource = dataSourceLookup.getDataSource("jdbc/examplejndi");
        return dataSource;

    }

    @Primary
    @Bean(name = "exampleTransactionManager")
    public PlatformTransactionManager exampleTransactionManager() {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(exampleEntityManager().getObject());
        return transactionManager;
    }   
}
@配置
@启用事务管理
@EnableJpaRepositories(基本包={
“br.com.example.repository”},entityManagerFactoryRef=“exampleEntityManager”,transactionManagerRef=“exampleTransactionManager”)
公共类示例DataSourceConfig{
@初级的
@Bean(name=“exampleEntityManager”)
public LocalContainerEntityManagerFactoryBean示例EntityManager(){
最终LocalContainerEntityManagerFactoryBean em=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(exampleDataSource());
em.setPackagesToScan(新字符串[]{
“br.com.example.domain”});
最终HibernateJavaEndorapter供应商适配器=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
最终HashMap属性=新HashMap();
properties.put(“hibernate.hbm2ddl.auto”、“validate”);
properties.put(“hibernate.dialogue”、“org.hibernate.dialogue.mysqldialogue”);
em.setPersistenceUnitName(“examplePU”);
em.setJpaPropertyMap(属性);
返回em;
}
公共数据源exampleDataSource(){
JndiDataSourceLookup dataSourceLookup=新的JndiDataSourceLookup();
DataSource DataSource=dataSourceLookup.getDataSource(“jdbc/examplejndi”);
返回数据源;
}
@初级的
@Bean(name=“exampleTransactionManager”)
公共平台TransactionManager示例TransactionManager(){
最终JpaTransactionManager transactionManager=新的JpaTransactionManager();
transactionManager.SetEntityManager工厂(例如EntityManager().getObject());
返回事务管理器;
}   
}

您的存储库包是否映射到配置类

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {
        "br.com.example.repository"}, entityManagerFactoryRef = "exampleEntityManager", transactionManagerRef = "exampleTransactionManager")
public class ExampleDataSourceConfig {

    @Primary
    @Bean(name = "exampleEntityManager")
    public LocalContainerEntityManagerFactoryBean exampleEntityManager() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(exampleDataSource());
        em.setPackagesToScan(new String[] { 
                "br.com.example.domain"});

        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        final HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", "validate");
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");      
        em.setPersistenceUnitName("examplePU");
        em.setJpaPropertyMap(properties);
        return em;
    }

    public DataSource exampleDataSource() {
        JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
        DataSource dataSource = dataSourceLookup.getDataSource("jdbc/examplejndi");
        return dataSource;

    }

    @Primary
    @Bean(name = "exampleTransactionManager")
    public PlatformTransactionManager exampleTransactionManager() {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(exampleEntityManager().getObject());
        return transactionManager;
    }   
}
@配置
@启用事务管理
@EnableJpaRepositories(基本包={
“br.com.example.repository”},entityManagerFactoryRef=“exampleEntityManager”,transactionManagerRef=“exampleTransactionManager”)
公共类示例DataSourceConfig{
@初级的
@Bean(name=“exampleEntityManager”)
public LocalContainerEntityManagerFactoryBean示例EntityManager(){
最终LocalContainerEntityManagerFactoryBean em=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(exampleDataSource());
em.setPackagesToScan(新字符串[]{
“br.com.example.domain”});
最终HibernateJavaEndorapter供应商适配器=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
最终HashMap属性=新HashMap();
properties.put(“hibernate.hbm2ddl.auto”、“validate”);
properties.put(“hibernate.dialogue”、“org.hibernate.dialogue.mysqldialogue”);
em.setPersistenceUnitName(“examplePU”);
em.setJpaPropertyMap(属性);
返回em;
}
公共数据源exampleDataSource(){
JndiDataSourceLookup dataSourceLookup=新的JndiDataSourceLookup();
DataSource DataSource=dataSourceLookup.getDataSource(“jdbc/examplejndi”);
返回数据源;
}
@初级的
@Bean(name=“exampleTransactionManager”)
公共平台TransactionManager示例TransactionManager(){
最终JpaTransactionManager transactionManager=新的JpaTransactionManager();
transactionManager.SetEntityManager工厂(例如EntityManager().getObject());
返回事务管理器;
}   
}

当您遇到您提到的编译错误时,即:

此位置不允许使用注释
@Query

那就意味着你在某个地方使用了一个注释,而这个注释不是为你准备的。如果注释只允许您将其放在方法的顶部,那么当您将其放在类的顶部或属性的顶部时,将出现此异常

在这种情况下,
@Query
注释仅针对方法和其他注释(以便您可以使用它形成自定义注释),如所示:

您应该将查询定义为方法,当前已将其映射到字段。要解决此问题,请编写一个方法:

@Query(value = "select d from dept d where name = 'ACCOUNTING'")
List<Dept> findByAccounting(); // Using "()"
@Query(value=“从部门d中选择d,其中名称=‘会计’”)
列出findByAccounting();//使用“()”

当您遇到您提到的编译错误时,即:

此位置不允许使用注释
@Query

那就意味着你在某个地方使用了一个注释,而这个注释不是为你准备的。如果注释只允许您将其放在方法的顶部,那么当您将其放在类的顶部或属性的顶部时,将出现此异常

在这种情况下,
@Query
注释仅针对方法和其他注释(以便您可以使用它形成自定义注释),如所示:

您应该将查询定义为方法,当前已将其映射到字段。要解决此问题,请编写一个方法:

@Query(value = "select d from dept d where name = 'ACCOUNTING'")
List<Dept> findByAccounting(); // Using "()"
@Query(value=“从部门d中选择d,其中名称=‘会计’”)
列出findByAccounting();//使用“()”
而不是

public interface DeptRepo extends JpaRepository<Dept, Long> {
   @Query(value = "select d from dept d where name = 'ACCOUNTING'")
   List<Dept> findByAccounting;
}
公共接口DeptRepo扩展了JpaRepository{
@查询(value=“从部门d中选择d,其中名称=‘会计’”)
列出FindByaAccounting;
}
使用

公共接口DeptRepo扩展了JpaRepository{
@查询(value=“从部门d中选择d,其中名称=‘会计’”)
列出findByAccounting();
}
而不是

public interface DeptRepo extends JpaRepository<Dept, Long> {
   @Query(value = "select d from dept d where name = 'ACCOUNTING'")
   List<Dept> findByAccounting;
}
公共接口DeptRepo扩展了JpaRepository{
@查询(value=“从部门d中选择d,其中名称=‘会计’”)
列出FindByaAccounting;
}
使用

public interface DeptRepo extends JpaRepository<Dept, Long> { @Query(value = "select d from dept d where name = 'ACCOUNTING'") List<Dept> findByAccounting(); }