2011-01-19 18 views
0

問題は簡単ではありますが、解決策を見つけるのに問題があります。私はデータテーブルに表示したいデータベースがあります。しかし、私は現在の行についてより多くの情報を得る追加の列が必要です。たとえば、データベースにはID番号の人がいます。名前、姓、ID(データベースのすべての列)を表示するのが必要ですが、別のREST Webサービスにあるアドレスを表示したい場合は、データベースからIDを送信する必要があります。JSF - データベース行の値を使用してデータテーブル内に追加の列を生成する方法

-myデータベースには、3つの列があります:私は、私ははっきりとそれを説明してきたが、念のために私が指摘を願っ名、ラス名を、ID番号 -Iアドレス と私のDataTableに4列を追加する必要があります - アドレスを取得する残りのウェブサービスにID番号を送信する必要があります

これまで唯一の解決策は、すべてのデータベース要素をリストまたはコンテナに追加してから、Bean内で使用することでした。しかし、それはデータベースが非常に大きいので容認できません。もっと簡単な方法が必要ですが、Googleが適切な結果を得るための適切な質問を作成できないようです。>誰かがアドバイスをすることはできますか?

答えて

1

あなたが基本的に望むのは、データベースへのクエリの結果とWebサービスの結合を行うことです。

もちろん、この「結合」を行うために一部のBeanにDB全体をロードする必要はありません。バッキングBeanの画面に表示したいデータをロードし、各行のアドレスをロードし、結果をデータテーブルにバインドします。

このような何か:

@ManagedBean 
@ViewScoped 
public class MyBean { 

    @EJB 
    private someDataService; 

    @EJB 
    private someWebService; 

    List<Person> persons; 
    Map<Long, String> addresses; 

    @PostConstruct 
    public void retrieveData() { 
     persons = someDataService.getByID(someID); 
     for (Person person : persons) { 
      addresses.put(person.getID(), someWebService.getByID(person.getID)); 
     } 
    } 

    // getters here 
} 

とにfacelet:

<h:dataTable value="#{myBean.persons}" var="person"> 
    <h:column> 
     #{person.name} 
    </h:column> 
    <h:column> 
     #{person.lastName} 
    </h:column> 
    <h:column> 
     #{myBean.addresses[person.ID]}  
    </h:column>    
</h:dataTable> 

作られているいくつかの選択肢があります。また、単一のサービスの内部で結合することもでき、アドレスを含むいくつかの型を返すこともできます。ラッパーやデコレータを作ることもできます。

フェッチされた各アドレスに対して個別の呼び出しを要求するのではなく、WebサービスがIDのリストを処理できる場合は、さらに効率的です。 )ローカルのキャッシュなどをしたいかもしれませんが、その詳細はあなた次第です;

+0

応答arjanありがとうございます。投稿したコードに疑問が1つあります。 人= someDataService.getByID(someID); どのように動作しますか?データベース全体を人物リストにロードしますか?もしそうなら、それはsthでした。私は避けようとしていた。そうでない場合、どのように 'someID'引数をキューに入れられているデータベースの '現在の'行に接続できますか? –

+0

@PostConstructメソッドには現在の行の概念はありませんが、そこにはDB全体が使用されていません。この呼び出しは、1つの画面に表示するデータに対して1回のクエリを実行することです。どのくらいのアイテムがあなた次第ですが、一般的なディスプレイは25〜100行です。 @PostContructは一度だけ実行され、100人のリストを取得し、その後レンダリングは100人をレンダリングします。 –

+0

Ok atjanありがとう、私は今、少なくとも今の写真を得ると思う:>あなたのアプローチを試みるだろうが、残念ながら、DBがクラッシュしてから週末の前にはない。また、おそらく私はそれを接続するために休止状態が必要になることが判明した。 –

関連する問題