我对Spring启动并尝试使用Java Persistence API + hibernate + mySQL持久层构建Spring启动应用程序相当新。但是,当我尝试使用entityManager.createNamedQuery("SELECT * FROM Student s", Student.class).getResultList()
获取所有记录时,它会给我以下异常。
java.lang.IllegalArgumentException:没有为该名称定义查询 [SELECT * FROM学生] at org.hibernate.internal.AbstractSharedSessionContract.buildQueryFromName(AbstractSharedSessionContract.java:771) 〜[休眠核-5.2.17.Final.jar:5.2.17.Final] at org.hibernate.internal.AbstractSharedSessionContract.createNamedQuery(AbstractSharedSessionContract.java:869) 〜[休眠核-5.2.17.Final.jar:5.2.17.Final] 在org.hibernate.internal.AbstractSessionImpl.createNamedQuery(AbstractSessionImpl.java:23) 〜[休眠核-5.2.17.Final.jar:5.2.17.Final] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)〜[na:1.8.0_131] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 〜[NA:1.8.0_131] at 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) 〜[弹簧ORM-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在com.sun.proxy。$ Proxy87.createNamedQuery(未知来源)〜[na:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)〜[na:1.8.0_131] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 〜[NA:1.8.0_131] at 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) 〜[弹簧ORM-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在com.sun.proxy。$ Proxy87.createNamedQuery(未知来源)〜[na:na] 在com.sys.sch.orm.dao.impl.StudentDaoImpl.findAll(StudentDaoImpl.java:30) 〜[校系统ORM-1.0-SNAPSHOT.jar:NA]
我试图在没有persistence.xml
或hibernate.cfg.xml
的情况下配置此项目并尝试使用spring boot auto配置。
我还添加了@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
如果有人能告诉我我做错了什么,我会非常感激。
答案 0 :(得分:0)
system_process E/ActivityManager: ANR in <package name> (<package name>.MainActivity)
PID: 6764
Reason: Input dispatching timed out (Waiting to send key event because the focused window has not finished processing all of the input events that were previously delivered to it. Outbound queue length: 0. Wait queue length: 1.)
Load: 0.9 / 0.39 / 0.18
CPU usage from 208977ms to 0ms ago (2018-05-27 09:51:27.527 to 2018-05-27 09:54:56.505):
0.4% 1306/surfaceflinger: 0.1% user + 0.3% kernel
0.3% 1611/system_server: 0.2% user + 0.1% kernel / faults: 6915 minor
0.2% 1311/audioserver: 0% user + 0.2% kernel / faults: 3 minor
0.1% 1327/adbd: 0% user + 0.1% kernel / faults: 3442 minor
0.1% 2215/com.estrongs.android.pop: 0% user + 0% kernel / faults: 1198 minor 1 major
0.1% 2405/com.google.android.gms: 0% user + 0% kernel / faults: 2389 minor
0% 2073/com.google.android.gms.persistent: 0% user + 0% kernel / faults: 344 minor
0% 1812/com.android.systemui: 0% user + 0% kernel / faults: 171 minor
0% 2121/com.google.android.leanbacklauncher: 0% user + 0% kernel / faults: 851 minor
0% 8/rcu_preempt: 0% user + 0% kernel
0% 1255/logd: 0% user + 0% kernel / faults: 19 minor
0% 2255/com.android.defcontainer: 0% user + 0% kernel / faults: 248 minor
0% 1253/jbd2/vdc-8: 0% user + 0% kernel
0% 6289/logcat: 0% user + 0% kernel
0% 7/migration/0: 0% user + 0% kernel
0% 12/ksoftirqd/1: 0% user + 0% kernel
0% 682/kworker/u4:2: 0% user + 0% kernel
0% 1247/kworker/0:1H: 0% user + 0% kernel
0% 1302/healthd: 0% user + 0% kernel
0% 1305/servicemanager: 0% user + 0% kernel
0% 1322/netd: 0% user + 0% kernel / faults: 217 minor
0% 1828/sdcard: 0% user + 0% kernel
0% 2153/com.google.android.leanbacklauncher.recommendations: 0% user + 0% kernel / faults: 24 minor
0% 2551/.esfm: 0% user + 0% kernel / faults: 7 minor
0% 6292/kworker/1:1: 0% user + 0% kernel
+0% 6764/<package name>: 0% user + 0% kernel
34% TOTAL: 33% user + 1.1% kernel + 0% iowait + 0.1% softirq
CPU usage from 329ms to 835ms later (2018-05-27 09:54:56.834 to 2018-05-27 09:54:57.339):
99% 6764/<package name>: 99% user + 0% kernel
100% 6764/an.<app name>: 100% user + 0% kernel
1.9% 1611/system_server: 0% user + 1.9% kernel
51% TOTAL: 51% user + 0% kernel
和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();
采用jpql语句
createQuery()
或更简单
Query query = entityManager.createQuery("select s from Student s");