1

次のPrimefaces3.1p:datatableから複数のパラメーターを渡すことを検討しています。

 <p:dataTable value="#{tableBean.carsModel}" var="var" rowkey="#{var.model}" 
              selection="#{tableBean.car}" selectionMode="single">
    <p:ajax event="rowSelect" listener="#{tableBean.onRowClick}"></p:ajax>
    <p:column>
        <f:facet name="header">
            <h:outputText styleClass="outputText" value="Model"></h:outputText>
        </f:facet>
        <h:outputText styleClass="outputText" value="#{var.model}"></h:outputText>
    </p:column>
    <p:column>
        <f:facet name="header">
            <h:outputText styleClass="outputText" value="Color"></h:outputText>
        </f:facet>
        <h:outputText styleClass="outputText" value="#{var.randomColor}"></h:outputText>
    </p:column>
</p:dataTable>

主キーとして複数のキーを使用している状況があります rowkey="#{var.model}が、複数の主キーを操作する方法を使用しています。

私もCarDataModel extends ListDataModel<Car> implements SelectableDataModel<Car>{ クラスを使っています。誰かが私にどのように働くか教えてもらえますか?

@Override
public Car getRowData(String rowKey) {
    //In a real app, a more efficient way like a query by rowKey 
    //should be implemented to deal with huge data
    List<Car> cars = (List<Car>) getWrappedData();
    for(Car car : cars) {
        if(car.getModel().equals(rowKey))
            return car;
    }
    return null;
}

@Override
public Object getRowKey(Car car) {
    return car.getModel();
}

どんな助けでも大歓迎です。

4

3 に答える 3

5

行キーとして代わりに複合キーを使用する必要があります。

例えば

rowKey="#{car.compositeKey}"

または、使用を主張する場合SelectableDataModel

@Override
public Car getRowData(String rowKey) {
    List<Car> cars = (List<Car>) getWrappedData();

    for (Car car : cars) {
        if (car.getCompositeKey().equals(rowKey))
            return car;
    }

    return null;
}

@Override
public Object getRowKey(Car car) {
    return car.getCompositeKey();
}

の具体的な実装に関してはgetCompositeKey()、使用している2つの主キーと使用している永続化APIが不明です。たとえば、JPAはすでに複合キーをサポートしているため、エンティティはすでにそれをサポートしているはずです。ただし、何らかの理由でJPAを使用していない場合は、アイデアを説明するために、とが複合キーを表すと想定する例を次に示しますmodelcolor

public String getCompositeKey() {
    return model + "." + color;
}

または

public Object[] getCompositeKey() {
    return new Object[] { model, color };
}

Object#equals()または、契約に基づいて複合キーとして一意に表すもの。

于 2012-05-14T22:34:50.640 に答える
4

すべてのキーを使用してrowKeyを直接記述できます。

<p:dataTable id="productItemsTable" var="i" value="#{b2BOrdersBean.listProductItems}" 
                rowKey="#{i.id.orderId}_#{i.id.productType}_#{i.id.partId}" 
                selectionMode="single" selection="#{b2BOrdersBean.selectedProductItemRow}">

この問題を解決するための関数を作成することを心配する必要はありません。

動作するrowKeyに各キーを入力するだけです。

于 2016-09-26T07:39:28.047 に答える
1

基本クラスを拡張し、渡されたオブジェクトのプロパティで初期化し、カウンター値を使用してIdフィールドを追加することで、一意の(行)キーを提供することでこの問題を解決しました。まだ試していませんが、リフレクションと連携してプロパティフィールドのコピーを自動化する必要があります。なぜPFがそのような暗黙のメカニズムを提供しなかったのか私は混乱しています。

于 2012-09-27T13:36:51.893 に答える