2013-05-07 61 views
0

我是Java EE的新手。
我正在使用Eclipse Juno + Eclipse Link + MySQL。
目前我有一个JPA项目和一个动态web项目。
JPA项目包含在Web项目的构建路径中。
我在JPA项目中创建了一个“StudentDomain”类来从Student表中检索行。
它在JPA项目中的工作罚款
但在web项目中,只返回ID,其他字段,名称,性别和电子邮件都返回null。JPA - 仅检索主键,其他字段返回null

例如:
SQL:SELECT * FROM Student;

在JPA项目,我得到了以下结果:

ID Name Gender Email 
1 John M  [email protected] 
2 Emma F  [email protected] 

在Web项目,我得到了以下结果:

ID Name Gender Email 
1 null null null 
2 null null null 

下面是学生实体类的源代码。

package model; 

import java.io.Serializable; 
import java.lang.String; 
import javax.persistence.*; 

@Entity 
public class Student implements Serializable 
{ 
    @Id 
    @Column(name = "ID") 
    private int id; 

    @Column(name = "name") 
    private String name; 

    @Column(name = "gender") 
    private String gender; 

    @Column(name = "email") 
    private String email; 

    private static final long serialVersionUID = 1L; 

    public Student() 
    { 
    } 

    public int getId() 
    { 
     return this.id; 
    } 

    public void setId(int id) 
    { 
     this.id = id; 
    } 

    public String getName() 
    { 
     return this.name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    public String getGender() 
    { 
     return this.gender; 
    } 

    public void setGender(String gender) 
    { 
     this.gender = gender; 
    } 

    public String getEmail() 
    { 
     return this.email; 
    } 

    public void setEmail(String email) 
    { 
     this.email = email; 
    } 

} 
+0

是您的DAO或实体的StudentDomain类吗? – erencan 2013-05-07 08:10:30

+0

什么是DAO? StudentDomain不是实体类。这是我写函数来查询Student表,如getStudentByName(),getStudentByGender()。 – 2013-05-07 12:44:14

+0

DAO - >数据访问对象(http://en.wikipedia.org/wiki/Data_access_object) – 2013-05-07 13:28:25

回答

2

您使用的是哪个版本?如果这是您正在执行的本机SQL查询,那么对查询返回的列元数据可能是区分大小写的问题。根据EclipseLink版本,您可以尝试将持久性属性“eclipselink.jpa.uppercase-column-names”设置为true(在EclipseLink 2.1中添加),或者升级到默认情况下为true的最新版本。

您也可以尝试确保列注释中定义的字段与数据库返回的内容匹配 - ID列映射为“ID”,而其他列都是小写,可能是数据库默认情况下返回大写字母列的问题。

这只会是原生SQL的问题。您也可以尝试使用JPQL查询,例如em.createQuery(“从学生中选择s”)。

+0

MySQL对列名不是那么挑剔,所以不应该是这样,ID会返回“ID”作为字段名称,而“id”会返回匹配的“id”。 – 2013-05-07 14:53:56

+0

MySQL不是问题,Java是。如果MySQL将列名称返回为“GENDER”,那么使用“gender”将不会从返回的结果中获取基于列String进行散列处理的值。这就是JPQL可能工作的原因,因为EclipseLink控制列位置,但在原生SQL查询中必须使用列名称来查找返回结果中的值时,存在大小写问题。问题是实体具有ID,但不包含其他字段的小写字母,并且他提到“select *”,它只发生在原生SQL查询中,而不是JPQL – Chris 2013-05-07 16:04:10

+0

我完全同意。我正在向后看(我责怪.NET MVC搞乱我的思路)。声明“SELECT ID,姓名,性别,来自学生的电子邮件”可能会这样做。这是*搞砸了绑定,因为MySQL默认使用结果集上的数据库中的任何数据(并且列可以具有不同的事件,尽管它们不区分大小写)。 – 2013-05-07 17:11:03