在HashSet中添加数据库数据以填充SelectItem

时间:2013-11-29 16:39:59

标签: jpa collections primefaces filtering

我有上面的方法来填充Primefaces 4 filterOption dataTable列:

<p:column filterBy="#{item.prefDep}" filterOptions="#{upbController.prefDepItems}" >

我已经在使用HashSet来避免重复的值,但我不清楚为什么它会从数据库列加载所有数据并呈现一个充满重复值的巨大组合。

有人可以帮忙吗?

托管bean中的方法:

public Set<SelectItem> getPrefDepItems() {
    Set<SelectItem> setList = new HashSet<>();
    setList.add(new SelectItem("", "Options..."));
    for (Upb id : getPrefDepsList()) {   
        setList.add(new SelectItem(id.getPrefDep()));
    }
    return setList;
}

Abstract Controller中的方法:

public List<T> getPrefDepsList() {
    if (prefDeps == null) {
        prefDeps = this.ejbFacade.findPrefDeps();
    }
    return prefDeps;
}

Abstract Facade中的方法:

public List<T> findPrefDeps() {
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
    cq.select(cq.from(entityClass));
    return getEntityManager().createQuery(cq).getResultList();
}

实体Bean中的namedQuery:

@NamedQuery(name = "Upb.findPrefDeps", query = "SELECT DISTINCT u.prefDep FROM Upb u")

提前致谢。

1 个答案:

答案 0 :(得分:0)

问题在于      setList.add(new SelectItem(id.getPrefDep())); 因为集合会将每个SelectItem视为不同的(我猜equals方法不会比较值,只是SelectItem地址)

解决方法是更改​​ getPrefDepsList 方法,以便在您使用时返回Set of T或Upb,或执行以下操作:

public Set<SelectItem> getPrefDepItems() {
    Set<SelectItem> setList = new HashSet<>();
    setList.add(new SelectItem("", "Options..."));

    Set<Upb> setPrefDeps = new HashSet<>();
    setPrefDeps.addAll(getPrefDepsList());
    for (Upb id : setPrefDeps) {   

        setList.add(new SelectItem(id.getPrefDep()));
    }
    return setList;
}

还要确保将equals和hashCode放入Upb。