当前位置:  开发笔记 > 编程语言 > 正文

@NamedQuery将表/列名更改为大写,引起异常

如何解决《@NamedQuery将表/列名更改为大写,引起异常》经验,为你挑选了1个好方法。

我在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 getCourseEntities(){
    //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类名,这也不是我的情况。



1> Lukas Eder..:

@Table批注中使用反引号使JPA用例区分大小写:

@Entity
@Table(name="`Course`")
@NamedQuery(name="Course.findAll", query="SELECT c FROM Course c")
public class Course implements Serializable { ...

显然,您必须使用数据库中使用的真实名称。例如,如果名称全为小写,请使用:

@Table(name="`course`")

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有