Java @NamedQuery将表/列名更改为大写,导致执行

Java @NamedQuery将表/列名更改为大写,导致执行,java,mysql,jpa,jdbc,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="SE

我在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();
}
阅读错误后,问题似乎是@NamedQuery生成的查询是大写的,因此找不到课程表

在my.cnf中,我有小写的表格名称=2,但不确定这是否会有所不同

我的persistence.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/课程管理
pckt.book.ch7.jpa.Course
jdbc/CourseManagement是GlassFish中的JNDI资源,它指向课程管理数据库的连接池,其中课程是一个表。我知道我可以成功连接到数据库,因为我能够ping它

问题:

  • 是否需要将查询转换为大写
  • 如何解决此问题

  • 我对此做了一些研究,但没有找到任何适合我的情况。一些解决方案建议更改表名(我不能这样做)或更改DAO类名称,这也不是我的情况。

    仔细阅读您的异常,它说:

     Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table   'course_management.COURSE' doesn't exist
    
    检查persistence.xml文件,即用于存储数据库的名称


    请确保不要手动创建表

    通读异常,它会显示:

     Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table   'course_management.COURSE' doesn't exist
    
    检查persistence.xml文件,即用于存储数据库的名称


    确保不要手动创建表

    @Table
    注释中使用反勾号,以使JPA使用区分大小写的名称:

    @Entity
    @Table(name="`Course`")
    @NamedQuery(name="Course.findAll", query="SELECT c FROM Course c")
    public class Course implements Serializable { ...
    
    显然,您必须使用数据库中使用的真实姓名。例如,如果名称都是小写,请使用:

    @Table(name="`course`")
    

    @表
    注释中使用反勾号使JPA区分大小写:

    @Entity
    @Table(name="`Course`")
    @NamedQuery(name="Course.findAll", query="SELECT c FROM Course c")
    public class Course implements Serializable { ...
    
    显然,您必须使用数据库中使用的真实姓名。例如,如果名称都是小写,请使用:

    @Table(name="`course`")
    


    你能发布你的课程和persistence.xml吗?@Abdelhak我已经将它们添加到了问题中。这取决于你的JPA提供者如何允许你选择区分大小写的表名。也许它有一个持久性属性来实现这一点。MySQL允许区分大小写,但如果sensitivelower_case_table_names设置为0,则必须在表名周围加引号,表名按指定存储,比较区分大小写。如果设置为1,则表名以小写形式存储在磁盘上,并且比较不区分大小写。如果设置为2,则表名按给定值存储,但以小写字母进行比较。此选项也适用于数据库名称和表aliases@NarendraJaggi也许你应该指定什么是“小写字母表名”,而不是假设他知道你的意思。。。一些MySQL连接属性?一些EclipseLink持久性属性?你能发布你的课程和persistence.xml吗?@Abdelhak我已经将它们添加到了问题中。这取决于你的JPA提供者如何允许你选择区分大小写的表名。也许它有一个持久性属性来实现这一点。MySQL允许区分大小写,但如果sensitivelower_case_table_names设置为0,则必须在表名周围加引号,表名按指定存储,比较区分大小写。如果设置为1,则表名以小写形式存储在磁盘上,并且比较不区分大小写。如果设置为2,则表名按给定值存储,但以小写字母进行比较。此选项也适用于数据库名称和表aliases@NarendraJaggi也许你应该指定什么是“小写字母表名”,而不是假设他知道你的意思。。。一些MySQL连接属性?一些EclipseLink持久性属性?我已经将此添加到了问题中。您能给我指出任何说明这一点的文档吗?你是说我不能使用已经存在的数据库?这将是一个巨大而荒谬的限制。他的意思是,表的元数据与您创建的表不一致。最简单的方法是让JPA实现创建DDL,然后您要么应用它,要么更新JPA注释来解决问题。对不起,我不明白,元数据在哪里,为什么会不一致?我无法更改表名或创建新表,因此我需要它以某种方式处理现有表。请尝试使用Mysql dbms查询您的表,并在例外情况下进行查询:从课程中选择ID、学分、名称、教师ID,我已经把这个添加到问题中了。你能给我指一下说明这一点的文档吗?你是说我不能使用已经存在的数据库?这将是一个巨大而荒谬的限制。他的意思是,表的元数据与您创建的表不一致。最简单的方法是让JPA实现创建DDL,然后您要么应用它,要么更新JPA注释来解决问题。对不起,我不明白,元数据在哪里,为什么会不一致?我无法更改表名或创建新表,因此我需要它以某种方式处理现有表。请尝试使用Mysql dbms查询您的表,并在例外情况下使用查询:从课程中选择ID、学分、名称、教师ID,然后查看它是否有效“课程”不是表名,而是实体名。“课程”表名和实体名都是。@NeilStockton:我就知道不会那么容易。嗯。我永远都不会习惯写JPQL…这正是过去的情况。“课程”不是表名,而是实体名。“课程”是表名和实体名。@NeilStockton:我知道这不会那么容易。嗯。我永远不会习惯于写JPQL…这正是它的本来面目。