【发布时间】:2016-03-23 08:24:19
【问题描述】:
我有一个正常工作的 jpa 实体,但是在我添加了新的 getter 和 setter 之后,它会返回以下异常:
引起:java.lang.IllegalArgumentException: NamedQuery of name: BedOccupation.findByDateofstay not found。 在 org.eclipse.persistence.internal.jpa.QueryImpl.getDatabaseQueryInternal(QueryImpl.java:351) 在 org.eclipse.persistence.internal.jpa.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1124) 在 org.eclipse.persistence.internal.jpa.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1144) 在 tcyh.BedOccupationModel.fetchBO(BedOccupationModel.java:42) 在 tcyh.BedOccupationModel.fetchBO(BedOccupationModel.java:48) 在 tcyh.MainWindowController.selectTab(MainWindowController.java:382) 在 tcyh.MainWindowController.initialize(MainWindowController.java:184) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548) ... 14 更多我肯定在实体 BedOccupation 中定义了命名查询,所以我猜这只是因为 getter 和 setter 获取或设置 List 而不是 String。 以下是一些代码:
BedOccupation fetchBO(Date date) {
EntityManager em = ConnectTCYHPU.getInstance().getEM();
TypedQuery tquery = em.createNamedQuery("BedOccupation.findByDateofstay", BedOccupation.class);
tquery.setParameter("dateofstay", date);
return (BedOccupation) tquery.setHint(QueryHints.REFRESH, HintValues.TRUE).getSingleResult();
}
....
@Entity
@Table(name = "BEDOCCUPATION")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "BedOccupation.findByDateofstay", query = "SELECT r FROM BedOccupation r WHERE r.dateofstay = :dateofstay"),
....
public class BedOccupation implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "DATEOFSTAY")
@Temporal(TemporalType.DATE)
private Date dateofstay;
@Basic(optional = false)
@Column(name = "MDORM")
private String mdorm;
....
//These are getter/setter generated by NetBeans
public String getMDorm() {
return mdorm;
}
public void setMDorm(String mdorm) {
this.mdorm = mdorm;
}
//These are getter/setter I added.
public List<String> getMDormList() {
return CSVToList(mdorm);
}
public void setMDormList(List<String> mdormList) {
this.mdorm = listToCSV(mdormList);
}
....
private List<String> CSVToList(String str) {
List list = new ArrayList<>();
list.addAll(Arrays.asList(str.split(",", -1)));
return list;
}
private String listToCSV(List list) {
StringBuilder strb = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
strb.append(list.get(i));
if (i < list.size() - 1) {
strb.append(",");
}
}
return strb.toString();
}
我是否需要添加一些注释或做其他任何事情,以添加与字段无关的 setter/getter?
【问题讨论】:
-
会不会是实体没有包含在persistence.xml中?或者它有错误?你有其他使用这个实体的测试吗?
-
实体包含在 persistence.xml 中,在我添加列表的 getter/setter 之前,它工作正常。但是很抱歉,这可能是由其他更改引起的……我会在找到实际原因时回来。