【问题标题】:List<Object []> in JSF dataTableJSF 数据表中的 List<Object []>
【发布时间】:2014-05-20 21:49:56
【问题描述】:

我有两个实体,员工和出版物: 我想在数据表中显示存储在数据库中的出版物标题、日期和作者: 这是我使用 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 页面的数据表中显示这些信息。

【问题讨论】:

    标签: jsf jpa datatable


    【解决方案1】:

    目前查询将返回 Array 而您需要的是 Construct 返回类型..

    1. 创建自定义类(这将是您的返回类型,并且它必须具有构造函数,该构造函数采用您在查询字符串中定义的结果值。)

      公共类publicationModel

      {

      公共字符串出版物名称; 公共字符串作者;

        public publicationModel (String publicationName, String author) 
        {
          this.publicationName= publicationName;
          this.author= author;
        } 
      }
      
    2. 使用类型化查询

      String queryStr ="SELECT NEW example.publicationModel (c.titrePublication, p.login) " + "FROM Publication c JOIN c.employee p";

      TypedQuery 查询 = em.createQuery(queryStr, publicationModel .class);

      列出 结果 = query.getResultList();

    我无法格式化答案..但我希望这会有所帮助..

    【讨论】:

      【解决方案2】:

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

      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
      
      }
      

      然后,用&lt;h:dataTable&gt; 显示数据,如下所示:

      <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>
      

      【讨论】:

      • 不要在构造函数中填充列表,在 @Postconstruct 注释方法中进行。stackoverflow.com/questions/5765853/…
      • 是啊,那个时候不是好主意。我以后更喜欢用最少的方法。
      【解决方案3】:

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

      List<Publication>=em.createQuery("select p from Publication p",Publication.Class).getResultList();
      

      在托管 bean 中,我应该声明作者,它是具有 getter 和 setter 的 Employee 实体。 然后创建一个名为 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>
      

      所以解决方案非常接近您的答案 Omar 非常感谢您的帮助。

      【讨论】:

      猜你喜欢
      • 2014-02-25
      • 2021-04-15
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多