如何获取select distinct作为实体列表而不是元组的结果

时间:2015-04-20 14:43:12

标签: java hibernate jpa orm jpa-2.0

我正在编写一个JSF应用程序,该应用程序允许用户从用户单击特定文件夹链接的文件夹列表中选择文档列表,以查看与所选文件夹相关的文档列表。

在尝试传统的ORM方法后,我尝试定义以下结果类:

 @SuppressWarnings("unchecked")
public List<ProjectDocs> findAllFolders(int projectid) {
    final String SQLCOMMAND
            = "SELECT DISTINCT d.classification, d.fk_projectdoc_id " + "FROM "
            + ProjectDocs.class.getSimpleName() + " d "
            + " WHERE d.fk_projectdoc_id = ?1";

    Query query = em.createQuery(SQLCOMMAND);
    query.setParameter(1, projectid);
    try {
      //  ListDataModel<ProjectDocs> lresults = new ListDataModel<ProjectDocs>(query.getResultList());
  List<ProjectDocs> lresults = query.getResultList();
        return lresults;
    } catch (Exception ex) {
        throw new RuntimeException("FAILED", ex);
    }
}

我的托管bean类是:

@ManagedProperty(value = "#{projBB}")
// @Model

private ProjectsBB projectBean;

 public String selectFolders() {

    projects = projectBean.getProjectList().getRowData();
    projectid = projects.getProjectid();
    projects.setProjectid(projectid);
    listModel = (ListDataModel<ProjectDocs>) getFolderBaseModel();
    return "ProDocsFolderList";

}


   public DataModel<ProjectDocs> getFolderBaseModel() {

    /* Check cache */
    if (this.folderBaseModel == null) {
        this.folderBaseModel= buildFolderListModel(this.projectid);
    }
    return this.folderBaseModel;
}

public DataModel<ProjectDocs> buildFolderListModel(int projectid) {
    List<ProjectDocs> folderList = proDocs.findFolderList(projectid);
    DataModel<ProjectDocs> model = new ListDataModel<ProjectDocs>(folderList);
    return model;
}

筹码:

WARNING:   StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NumberFormatException: For input string: "classification"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at javax.el.ArrayELResolver.toInteger(ArrayELResolver.java:378)
at javax.el.ArrayELResolver.getValue(ArrayELResolver.java:198)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)....

我几乎可以肯定这是由于在我的DAO类中使用显式Select语句引起的(我选择特定的实体字段而不是整个entiy),以便将结果返回为数组。

我想知道1)适当的结果类应该是什么样的? 2)我是否需要在定义的结果类中添加或代替定制的转换类?

更新:

我无法使用整个ProjectDocs实体,因为这只会生成一个文档列表,文件夹名称在每个文档旁边。我想看到只有DISTINCT文件夹列表所以我需要在SELECT语句中显式选择SELECT分类和projectid

提前致谢!

1 个答案:

答案 0 :(得分:1)

你说你想要List只是查询ProjectDocs而不是它们的字段:

String SQLCOMMAND
            = "SELECT DISTINCT d FROM "
            + ProjectDocs.class.getSimpleName() + " d "
            + " WHERE d.fk_projectdoc_id = ?1";

然后q uery.getResultList()将返回匹配的ProjectDocs列表,您应该使用类型化查询,因此您不需要强制转换:

TypedQuery<ProjectDocs> query = em.createQuery(SQLCOMMAND,ProjectDocs.class);

然后,您可以在JSF站点上访问ProjectDosc的分类字段。

使用当前的sql,你注意到你只要求两个字段,所以结果是Object [],第一个条目匹配类型的分类,第二个id(long?)。

如果你想要,你可以定义一个只有这两个属性的类,并将它用作结果的包装器,但通常只使用整个ProjectDocs bean。

public class Classification {
    String classification;
    long id;
    public Classification (String classification,long id) {
        this.Classification = classification;
        this.id = id;
    }
} 

String SQLCOMMAND
            = "SELECT new full.package.path.to.Classification( d.classification, d.fk_projectdoc_id) " + "FROM "
            + ProjectDocs.class.getSimpleName() + " d "
            + " WHERE d.fk_projectdoc_id = ?1";