【问题标题】:Spring boot hibernate auto scan entitiesSpring Boot休眠自动扫描实体
【发布时间】:2018-11-06 02:49:45
【问题描述】:

我是 Spring Boot 的新手,并尝试使用 Java Persistence API + hibernate + mySQL 持久层构建一个 Spring Boot 应用程序。但是当我尝试使用 entityManager.createNamedQuery("SELECT * FROM Student s", Student.class).getResultList() 获取所有记录时,它给了我以下异常。

java.lang.IllegalArgumentException:没有为该名称定义查询 [从学生中选择 *] 在 org.hibernate.internal.AbstractSharedSessionContract.buildQueryFromName(AbstractSharedSessionContract.java:771) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final] 在 org.hibernate.internal.AbstractSharedSessionContract.createNamedQuery(AbstractSharedSessionContract.java:869) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final] 在 org.hibernate.internal.AbstractSessionImpl.createNamedQuery(AbstractSessionImpl.java:23) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131] 在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131] 在 org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:350) ~[spring-orm-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在 com.sun.proxy.$Proxy87.createNamedQuery(Unknown Source) ~[na:na] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131] 在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131] 在 org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:304) ~[spring-orm-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在 com.sun.proxy.$Proxy87.createNamedQuery(Unknown Source) ~[na:na] 在 com.sys.sch.orm.dao.impl.StudentDaoImpl.findAll(StudentDaoImpl.java:30) ~[school-system-orm-1.0-SNAPSHOT.jar:na]

我正在尝试在没有 persistence.xmlhibernate.cfg.xml 的情况下配置此项目,并尝试使用 Spring Boot 自动配置。 我还添加了@EntityScan("com.sys.sch.orm.model") 作为我所做的大部分阅读。

@SpringBootApplication
@EnableAutoConfiguration
@EnableWebMvc
@ComponentScan({"com.sys.sch"})
@EntityScan("com.sys.sch.orm.model")
public class Program {

public static void main(String[] args) throws Exception {
    SpringApplication.run(Program.class, args);
}

实体:

@Entity(name = "student")
public class Student {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

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

@Column(name = "birth_date")
private Date birthDate;

@CreationTimestamp
private Date dateCreated;

@UpdateTimestamp
private Date dateUpdated;
// getters and setters
}

依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.0.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.15</version>
</dependency>
<dependency>
    <groupId>school-system</groupId>
    <artifactId>school-system-core</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.0.2.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>2.0.2.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
    <version>2.0.2.RELEASE</version>
</dependency>

application.properties:

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/schoolsys?createDatabaseIfNotExist=true
spring.datasource.username=root spring.datasource.password=
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.max-idle=20
spring.datasource.tomcat.min-idle=15
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.id.new_generator_mappings=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

Project structure

如果有人能告诉我我在这里做错了什么,我将非常感激。

【问题讨论】:

    标签: hibernate spring-boot jpa


    【解决方案1】:

    createNamedQuery()createQuery() 之间存在差异。

    createNamedQuery() 采用预定义查询的名称:

    @Entity(name = "student")
    @NamedQuery(query = "select s from Student s", name = "findAllStudents")
    public class Student {
        ...
    }
    

    然后可以通过其名称引用此查询:

    Query query = entitymanager.createNamedQuery("findAllStudents");
    List<Student> students = query.getResultList();
    

    另一方面,createQuery() 采用 jpql 语句

    Query query = entityManager.createQuery("select s from Student s");
    

    或者更简单

    Query query = entityManager.createQuery("from Student");
    

    【讨论】:

    • 非常感谢。我现在明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 2016-01-23
    • 2014-11-19
    • 1970-01-01
    相关资源
    最近更新 更多