【问题标题】:Got an Exception from JPA after adding additional getter and setter添加额外的 getter 和 setter 后从 JPA 获得异常
【发布时间】: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 之前,它工作正常。但是很抱歉,这可能是由其他更改引起的……我会在找到实际原因时回来。

标签: java jpa


【解决方案1】:

我发现我第一篇文章的错误是由实体类BedOccupation中定义的这些方法引起的:

static Comparator<String> compare(){
    return (String a, String b) -> {
        if (a.equals("")) {
            return b.equals("") ? 0 : 1;
        } else if (b.equals("")) {
            return -1;
        } else {
            return a.compareTo(b);
        }
    };
}

static Comparator<String> compareOrderDesc(){
    return (String aStr,String bStr) -> {
        if(aStr.equals("")) return 1;
        else if (bStr.equals("")) return -1;
        String[] a = aStr.split("_");
        String[] b = bStr.split("_");
        if (a[0].equals(b[0]) && a.length >= 2 && b.length >= 2){
            return - Integer.decode(a[1])
                    .compareTo(Integer.decode(b[1]));
        }
        return Integer.decode(a[0])
                .compareTo(Integer.decode(b[0]));
    };
}

我想在这种方法中做的是根据每个第一个值的第二个值对以“_”分隔的数字进行排序。

当我如下更改这些代码时,将不会发生错误:

static Comparator<String> compare(){
    return new Comparator() {
        @Override
        public int compare(Object o1, Object o2) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    };
}

static Comparator<String> compareOrderDesc(){
    return new Comparator() {
        @Override
        public int compare(Object o1, Object o2) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    };
}

我需要搜索更多关于它的信息,但这会是一个错误吗? 无论如何,谢谢你的帮助,我会尝试自己解决问题。

【讨论】:

  • 我将eclipselink.jar更新到最新版本,然后错误消失了。看来这是一个错误。
猜你喜欢
  • 2012-12-12
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多