当前位置: 代码迷 >> J2EE >> JPA经过外键查询时报错:could not resolve property
  详细解决方案

JPA经过外键查询时报错:could not resolve property

热度:969   发布时间:2016-04-17 23:37:48.0
JPA通过外键查询时报错:could not resolve property
以下有两个实体类:
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;

@Entity(name="record")
public class Record extends BaseObject {

private String name; //姓名

private String sex; //性别

private Date birthday; //出生年月

private String family; //民族

private String marital_status; //婚姻状况

private String politics_status; //政治面貌  

private String id_number; //身份证号

@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)//级联保存、更新、删除、刷新;延迟加载  
@JoinColumn(name="record_id")//在eduexp表增加一个外键列来实现一对多的单向关联
private Set<Eduexp> eduexp = new HashSet<Eduexp>(); //教育培训经历

省略 getter 和 setter 方法
}

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity(name="eduexp")
public class Eduexp extends BaseObject {

private Date edu_time; //起始时间
private Date edu_endtime;//结束时间
private String edu_org; //教育培训机构
private String course; //专业或课程

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = false) 
     private Record record;

省略 getter 和 setter 方法
}

我想通过 eduexp 中的外键 record_id 查询 eduexp  中的数据。

查询方法:

public String queryReocrdData(){

StringBuffer str_hql = new StringBuffer();
str_hql.append("SELECT new com.ewayit.model.Eduexp(E.edu_time, E.edu_endtime, E.edu_org, E.course) FROM ")
   .append("com.ewayit.model.Eduexp E WHERE E.RECORD_ID = ?1");

try {
toJson(getService().find(str_hql.toString(), id));

} catch (IllegalAccessException | IllegalArgumentException
InvocationTargetException | IntrospectionException e) {

e.printStackTrace();
}

return Action.SUCCESS;
}

但是报错:

------解决思路----------------------
sql 写错了吧,  ?  怎么有个1
------解决思路----------------------
实体是否有RECORD_ID 属性
------解决思路----------------------
实体加一个RECORD_ID 属性
------解决思路----------------------
@JoinColumn(name="record_id")
这个实体都没有建立这个属性啊  被关联的对象当然就找不到了
增加一个record_id
------解决思路----------------------
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)//级联保存、更新、删除、刷新;延迟加载  
@JoinColumn(name="record_id")//在eduexp表增加一个外键列来实现一对多的单向关联
private Set<Eduexp> eduexp = new HashSet<Eduexp>(); //教育培训经历

这里@JoinColumn应该是不需要的,你需要的是mappedby属性
你应该加个
mappedby="record"
其数据库中的列名将默认为"record_id",而你对应实体中的属性名则为record,这样就能符合你的要求了吧
  相关解决方案