我在MySql中有一个名为Course的表,在Course.java类中有以下内容
package pckt.book.ch7.jpa; import java.io.Serializable; import javax.persistence.*; /** * The persistent class for the Course database table. * */ @Entity @NamedQuery(name="Course.findAll", query="SELECT c FROM Course c") public class Course implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private int credits; private String name; @Column(name="Teacher_id") private int teacher_id; public Course() { } public int getId() { return this.id; } public void setId(int id) { this.id = id; } public int getCredits() { return this.credits; } public void setCredits(int credits) { this.credits = credits; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getTeacher_id() { return this.teacher_id; } public void setTeacher_id(int teacher_id) { this.teacher_id = teacher_id; } }
我正在另一个类中按以下方式运行查询
@PersistenceContext EntityManager entityManager; public ListgetCourseEntities(){ //Use named query created in Course entitiy //using @NamedQuery annotation TypedQuery courseQuery = entityManager.createNamedQuery("Course.findAll",Course.class); return courseQuery.getResultList(); }
我收到以下错误:
javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'course_management.COURSE' doesn't exist Error Code: 1146 Call: SELECT ID, CREDITS, NAME, Teacher_id FROM COURSE Query: ReadAllQuery(name="Course.findAll" referenceClass=Course sql="SELECT ID, CREDITS, NAME, Teacher_id FROM COURSE")
从读取错误开始,听起来问题在于@NamedQuery生成的查询是大写的,因此找不到COURSE表。
在my.cnf中,我有lower_case_table_names = 2,但是不确定是否应该有所作为。
我的persistance.xml如下
jdbc/CourseManagement pckt.book.ch7.jpa.Course
jdbc / CourseManagement是GlassFish中的JNDI资源,它指向Course_management数据库的连接池,其中Course是一个表。我知道我可以成功连接到数据库,因为我能够ping通它。
问题:
是否期望查询转换为大写?
如何解决此问题?
我对此进行了一些研究,但找不到适合我的情况的任何东西。一些解决方案建议更改表名(我不能这样做)或更改DAO类名,这也不是我的情况。
在@Table
批注中使用反引号使JPA用例区分大小写:
@Entity @Table(name="`Course`") @NamedQuery(name="Course.findAll", query="SELECT c FROM Course c") public class Course implements Serializable { ...
显然,您必须使用数据库中使用的真实名称。例如,如果名称全为小写,请使用:
@Table(name="`course`")