在JSF数据表中列出

在JSF数据表中列出,jsf,jpa,datatable,Jsf,Jpa,Datatable,我有两个实体,员工和出版物: 我想在数据表中显示存储在数据库中的出版物标题、日期和作者: 这是我使用JPQL的查询: private static EntityManager em; private static EntityManagerFactory factory; public PublicationDAO() { if(factory==null) factory=Persistence.createEntityManagerFactory("mavenTes

我有两个实体,员工和出版物: 我想在数据表中显示存储在数据库中的出版物标题、日期和作者: 这是我使用JPQL的查询:

private static EntityManager em;
private static EntityManagerFactory factory;

public PublicationDAO() {
    if(factory==null)
        factory=Persistence.createEntityManagerFactory("mavenTest");
    if(em==null)
        em=factory.createEntityManager();
}

public List<Object[]> getAllPublication() {
     em.getTransaction().begin();
     List<Object[]> pubs = em.createQuery("SELECT c.titrePublication, p.login FROM Publication c  JOIN c.employee p ").getResultList();
     em.getTransaction().commit();
     return pubs;
}

所以我想在XHTML页面的数据表中显示这些信息。

我想知道为什么要创建对象列表数组的类型。将其呈现为实体类的类型就足够了:

public List<Publication> getAllPublication() {
    ...
    List<Publication> pubs = ...
    ...
}
在表示层中指定managedBean类以执行此任务:

@RequestScoped
@ManagedBean    
public class PublicationBean {

    // Inject your PublicationDAO here
    private PublicationDAO publicationDao;

    private List<Publication> publications;

    @PostConstruct 
    public retrievePublications () {
        try {
            publications = publicationDao.getAllPublication();
        } catch (Exception e) {
        }
    }

    public List<Publication> getPublications() {
        return this.publications;
    }
    public void setPublications(List<Publication> publications) {
        this.publications= publications;
    }

// getters/setters

}
然后,以如下方式显示数据:

<h:dataTable value="#{publicationBean.publications}" var="p" rules="all">
    <h:column>
        <f:facet name="header">Publication title</f:facet>
        #{p.titrePublication}
    </h:column>
    <h:column>
        <f:facet name="header">Publication author</f:facet>
        #{p.employee.name}
    </h:column>
 </h:dataTable>

当前查询将返回数组,您需要的是构造返回类型

创建自定义类这将是您的返回类型,它必须具有构造函数,该构造函数接受您在查询字符串中定义的结果值

公共类发布模型

{

公共字符串publicationName; 公共字符串作者

  public publicationModel (String publicationName, String author) 
  {
    this.publicationName= publicationName;
    this.author= author;
  } 
}
使用typedQuery

String queryStr=选择NEW example.publicationModel c.titrePublication,p.login+ 从出版物c加入c.p

类型查询= em.createQueryqueryStr,publicationModel.class

List results=query.getResultList


i’我无法格式化答案。但我希望这能有所帮助。

嗨,我终于找到了解决方案: 正确的查询应该是:

List<Publication>=em.createQuery("select p from Publication p",Publication.Class).getResultList();
在托管bean中,我应该声明author,它是带有getter和setter的雇员实体。 然后创建一个名为getAllpublications的方法,如下所示:

public List<Publication> getAllpublications (){
publicationDao.getAllPublication();//this method is declared and specified in the DAO class
}
之后,xhtml页面应该如下所示:

<h:dataTable value="#{publicationBean.publications}" var="p" rules="all">
    <h:column>
        <f:facet name="header">Publication title</f:facet>
       <h:outputText value="#{p.titrePublication}"></h:outputText>
    </h:column>
    <h:column>
        <f:facet name="header">Publication author</f:facet>
        <h:outputText value="#{p.employee.name}"></h:outputText>
    </h:column>
 </h:dataTable>

因此,解决方案与您的答案非常接近。奥马尔非常感谢您的帮助。

在出版物的getter中调用dao non lazy是一种不好的做法。您将多次调用dao waaay。不要在构造函数中填充列表,而是在@Postconstruct注释的方法中进行。是的,当时这不是一个好主意。我更喜欢这样做o以后使用最少的方法。