【问题标题】:<h:dataTable> problem with present datas on JSF page<h:dataTable> JSF 页面中当前数据的问题
【发布时间】:2010-08-13 11:46:40
【问题描述】:

我在查看h:dataTable 项目中的数据时遇到了小问题。我有在数据库和 java 中正常工作的本机查询:

SELECT SUM(price_list.first_class_price), SUM(price_list.second_class_price)
FROM price_list, connections
WHERE connections.id = price_list.id_connect
GROUP BY connections.source;  

EJB 中的方法返回一个元素列表。这个方法看起来像这样:

public List<PriceList> getFirstClassPrices() { 
    Query q = em.createNativeQuery("SELECT SUM(price_list.first_class_price), SUM(price_list.second_class_price) FROM price_list, connections WHERE connections.id = price_list.id_connect GROUP BY connections.source"); 
    return q.getResultList(); 
}  

我想在 dataTableItem 中显示此查询的结果,但我不知道如何获取此值。我试图做这样的事情(FCP 是 JSF ManagedBean 中返回提到列表的方法):

<h:dataTable value="#{priceList.FCP}}" var="item" cellspacing="0" cellpadding="1" border="1"> 
<h:column> 
<f:facet name="header"> 
<h: outputText value="First class"/> 
</f:facet> 
<h: outputText value="#{item}"/> 
</h:column> 
<h:column> 
<f:facet name="header"> 
<h: outputText value="Second class"/> 
</f:facet> 
<h: outputText value="#{item}"/> 
</h:column> 
</h:dataTable> 

但这仅向我显示了表中结果的引用。

JSF ManagedBean 中的 FCP 方法如下所示:

public List<PriceList> getFCP() { 
    return priceListFacade.getFirstClassPrices(); 
} 

当我有这样的查询时,这个解决方案可以正常工作:

SELECT SUM(price_list.first_class_price) 
FROM price_list, connections 
WHERE connections.id = price_list.id_connect
GROUP BY connections.source;

只有一个 SUM 元素。然后正确的数据在表中,没有问题。

我的问题是:当我在查询中有两个或多个 SUM 元素时,如何获取数据,结果列表中没有引用?

我尝试使用这样的代码:

<h:dataTable value="#{priceList.FCP}}" var="item" cellspacing="0" cellpadding="1" border="1"> 
<h:column> 
<f:facet name="header"> 
<h: outputText value="First class"/> 
</f:facet> 
<h: outputText value="#{item.first_class_price}"/> 
</h:column> 
<h:column> 
<f:facet name="header"> 
<h: outputText value="Second class"/> 
</f:facet> 
<h: outputText value="#{item.second_class_price}"/> 
</h:column> 
</h:dataTable> 

但是我有一个 EJB 异常:没有像 first_class_price 和 second_class_price 这样的属性。

我试图改变这个查询:

SELECT SUM(price_list.first_class_price) AS p1, SUM(price_list.second_class_price) AS p2 
FROM price_list, connections 
WHERE connections.id = price_list.id_connect
GROUP BY connections.source; 

然后在 JSF 中我使用了这样的代码:

<h:dataTable value="#{priceList.FCP}}" var="item" cellspacing="0" cellpadding="1" border="1"> 
<h:column> 
<f:facet name="header"> 
<h: outputText value="First class"/> 
</f:facet> 
<h: outputText value="#{item.p1}"/> 
</h:column> 
<h:column> 
<f:facet name="header"> 
<h: outputText value="Second class"/> 
</f:facet> 
<h: outputText value="#{item.p2}"/> 
</h:column> 
</h:dataTable> 

但我有相同的 EJB 异常,即属性 p1 和 p2 不存在。

我是 Java EE 的新手,我无法处理这个问题。也许还有另一种方法可以解决我的问题?也许我不应该使用h:dataTableItem?

感谢您的回复。

【问题讨论】:

    标签: java jsf jpa jsf-2 java-ee-6


    【解决方案1】:

    我在另一个主题上找到了我的问题的解决方案。这是正确的解决方案:

    会话Bean:

    public List<Object[]> getFirstClassPrices() {
        Query q = em.createNativeQuery("SELECT SUM(price_list.first_class_price), "
                + "SUM(price_list.second_class_price), SUM(price_list.third_class_price), "
                + "SUM(price_list.luggage_fee), SUM(price_list.airport_fee), SUM(price_list.fuel_fee), "
                + "SUM(price_list.crew_salary), connections.source FROM price_list, connections WHERE connections.id = price_list.id_connect GROUP BY connections.source");
        List<Object[]> lista = q.getResultList();
        return lista;
    }
    

    JSF ManagedBean:

    public List<Object[]> getFCP() {   
        return priceListFacade.getFirstClassPrices();
    }
    

    最后是JSF页面的片段:

    <h:outputText value="#{item[0]}"/>
    

    【讨论】:

      【解决方案2】:

      我在我的应用程序中尝试使用“GROUP BY”查询时遇到了问题。我使用的解决方案如下:

      1、tableNamefacade.java:

      public List<Object[]> getAllGroupByCoulumn() {
        Query q = em.createNativeQuery("SELECT d.column FROM tableName d GROUP BY d.coulmn");
        List<Object[]> list = q.getResultList();
        return list;
      }
      

      2、tableNameController.java: bean的属性:

      private List<Object[]> items;
      

      和函数,准备在xhtml页面显示的列表:

      items = getFacade().getAllGroupByCoulumnm();
      

      3、最后在xhtml页面中dataTable:

      <h:dataTable value="#{myController.items}" var="item">
        ...
           <h:outputText value="#{item}">
        ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 2014-01-06
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多