Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring,Spring数据JPA:org.hibernate.hql.internal.ast.QuerySyntaxException:测试未映射_Spring_Hibernate_Spring Data_Spring Data Jpa - Fatal编程技术网

Spring,Spring数据JPA:org.hibernate.hql.internal.ast.QuerySyntaxException:测试未映射

Spring,Spring数据JPA:org.hibernate.hql.internal.ast.QuerySyntaxException:测试未映射,spring,hibernate,spring-data,spring-data-jpa,Spring,Hibernate,Spring Data,Spring Data Jpa,当我在Spring数据JPA Reposiotry中创建一个使用注释的方法时,我得到了一个org.hibernate.hql.internal.ast.QuerySyntaxException:Test未映射,Spring数据JPA会验证它 Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Test is not mapped [SELECT t

当我在Spring数据JPA Reposiotry中创建一个使用注释的方法时,我得到了一个
org.hibernate.hql.internal.ast.QuerySyntaxException:Test未映射
,Spring数据JPA会验证它

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Test is not mapped [SELECT t from Test t]
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:331)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.8.0_40]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [rt.jar:1.8.0_40]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_40]
    at java.lang.reflect.Method.invoke(Method.java:497) [rt.jar:1.8.0_40]
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:344)
    at com.sun.proxy.$Proxy125.createQuery(Unknown Source)
    at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:86)
    ... 47 more
存储库如下所示:

public interface TestRepository extends JpaRepository<Test, Long>{

   Test findByDescriptionContaining(String text); //works

   @Query("SELECT t from Test t") //fails
   Test getOr();

}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.company", entityManagerFactoryRef = "localContainerEntityManagerFactoryBean")
@ComponentScan("com.company")
public class PersistenceJPAConfig {

   private static final Logger LOGGER = LoggerFactory.getLogger(PersistenceJPAConfig.class);

   @Bean
   @DependsOn("dataSource")
   public JdbcTemplate jdbcTemplate() {
      return new JdbcTemplate(dataSource());
   }

   @Bean
   @DependsOn("dataSource")
   public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
      return new NamedParameterJdbcTemplate(dataSource());
   }

   @Bean
   public MailSender mailSender(){
      final MailSenderImpl mailSenderImpl = new MailSenderImpl();
      mailSenderImpl.setDataSource(dataSource());
      return mailSenderImpl;
   }

   @Bean
   public DataSource dataSource() {
      HikariConfig config = new HikariConfig();
      config.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
      config.setJdbcUrl("jdbc:sqlserver://localhost;DatabaseName=mydb");
      config.setUsername("user");
      config.setPassword("pass");
      config.setPoolName("HikariCpConnectionPool");
      config.setMaximumPoolSize(50);
      config.setMinimumIdle(2);
      return new HikariDataSource(config);
   }

   @Bean
   @DependsOn({"dataSource"})
   public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean() {
      LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
      em.setDataSource(dataSource());
      em.setPackagesToScan(new String[]{
         "com.company.**.*"
      });
      em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
      em.setJpaProperties(additionalProperties());
      return em;
   }

   @Bean
   public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
      return new PersistenceExceptionTranslationPostProcessor();
   }

   @Bean
   public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
      return new JpaTransactionManager(entityManagerFactory);
   }

   private Properties additionalProperties() {
      Properties properties = new Properties();
      properties.setProperty("hibernate.hbm2ddl.auto", "update");
      properties.setProperty("hibernate.dialect", "org.hibernate.dialect.SQLServer2012Dialect");
      properties.setProperty("hibernate.show_sql", "false");
      properties.setProperty("hibernate.format_sql", "false");
      properties.setProperty("hibernate.use_sql_comments", "false");
      properties.setProperty("hibernate.id.new_generator_mappings", "false");
      properties.setProperty("hibernate.enable_lazy_load_no_trans", "true");
      properties.setProperty("hibernate.generate_statistics", "false");
      return properties;
   }

}
更新:测试实体。基本实体具有
@Id Long Id
,是
@MappedSuperClass

@Entity(name = "test")
public class Test extends BaseEntity{

   public Test() {
   }

   @Column(name = "description")
   private String description;

使用
列表
获取所有对象

@Query("SELECT t from Test t") //fails
List<Test> getOr();
@Query(“从测试t中选择t”)//失败
List getOr();

因为
从测试t中选择t
从数据库中获取所有行。

删除setPackagesToScan属性中的
*
,只需使用-
em.setPackagesToScan(新字符串[]{“com.company”})

在实体中,指定一个
名称
属性,覆盖默认命名(类名称的使用)。因此,您的查询是错误的,您的查询需要一个名为
Test
的实体,但该实体不可用

您有两种可能的解决方案

  • 删除
    name
    属性并保持查询不变
  • 将查询更改为
    selectt fromtest t
    (注意
    t
    而不是
    t

    随后,您的返回类型也是错误的,因为它将返回元素的集合,而不是单个元素。因此,如果表的名称是数据库中的test,则将其更改为
    列表

    如下所示

    @Entity
    @Table(name="test")
    

    Test
    类是否用
    @Entity
    注释?是的,它用@Entity注释。您将
    Test
    实体放在哪个包中?该包是:
    com.company.Test
    。然而,我发现当我拥有
    packagesToScan
    com.company.**
    时,它将搜索
    com.company.
    下面的所有包。
  • 此外,请向我们提供测试
    类的代码。请您怎么说?我将存储库中的方法更改为
    List getOr()但它不工作-我仍然得到相同的错误。set
    properties.setProperty(“hibernate.show_sql”,“true”)然后查看查询出了什么问题。F**k。你是对的。我认为
    名称
    定义了数据库中的表名。我忘记了
    @Table
    注释是这样做的。4年JPA经验;)接受
    @Entity
    @Table(name="test")