java - @NamedQuery 将表/列名称更改为大写导致异常

标签 java mysql jpa jdbc

我在 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 List<Course> getCourseEntities(){
    //Use named query created in Course entitiy
    //using @NamedQuery annotation
    TypedQuery<Course> 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如下

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="CourseManagementEJB">
        <jta-data-source>jdbc/CourseManagement</jta-data-source>
        <class>pckt.book.ch7.jpa.Course</class>
    </persistence-unit>
</persistence>

jdbc/CourseManagement 是 GlassFish 中的一个 JNDI 资源,它指向 course_management 数据库的连接池,其中 Course 是一个表。我知道我可以成功连接到数据库,因为我可以 ping 通它。

问题:

  1. 是否希望将查询转换为大写?
  2. 我该如何解决这个问题?

我确实对此进行了一些研究,但无法找到适合我的情况的任何内容。一些解决方案建议更改表名称(我不能这样做)或更改 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`")

关于java - @NamedQuery 将表/列名称更改为大写导致异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34556930/

相关文章:

java - 如何在 Hibernate JPA @NamedEntityGraph 中引用继承的属性?

java - Java 中的算术运算

java - 在 Java 中检索矩阵的当前比例值

java - 了解工作单元

java - Mysql 日期/日期时间列和 Java 持久性

MySQL 使用 group by 从临时插入

sql - MySQL 查询仅返回具有计数的重复条目

java - 如何将 "java.nio.HeapByteBuffer"转换为字符串

java - JPA - 将对象级联保存到由 id 映射的数据库

java - Spring 数据 : JPA and Nested Transaction