0

アイテムのビュー データに小さな問題があり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;

1 つの SUM 要素を使用します。その後、正しいデータがテーブルにあり、問題はありません。

私の質問は次のとおりです。クエリに 2 つ以上の 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> 

しかし、プロパティ p1 と p2 が存在しないという同じ EJB 例外があります。

私はJava EEが初めてで、これを処理できません。多分私の問題を解決する別の方法がありますか?多分私は使用すべきではありませんh:dataTableItemか?

返信ありがとうございます。

4

2 に答える 2

0

アプリケーションで「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}">
  ...

于 2012-03-14T15:40:30.753 に答える
0

私は他のトピックで私の問題の解決策を見つけました。正しい解決策は次のとおりです。

セッション 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マネージドBean:

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

そして最後に JSF ページのフラグメント:

<h:outputText value="#{item[0]}"/>
于 2010-08-13T13:15:24.863 に答える