使用PF3.1中的onRowKey(p:datatable)传递多个参数

时间:2012-05-14 22:19:56

标签: jsf-2 primefaces

我希望从以下Primefaces 3.1 p传递多个参数: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>

我有一种情况,我有超过1个键作为主键,我使用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();
}

感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

您需要将复合键用作行键。

E.g。

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()的具体实现,目前还不清楚你拥有的两个主键以及你正在使用的持久性API。例如,JPA已经支持复合键,因此您的实体应该已经支持它。但是如果你出于某些原因没有使用JPA,那么这里有一个例子,假设modelcolor都代表复合键,只是为了说明这个想法:

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

或者

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

或基于Object#equals()合约唯一表示为复合键的内容。

答案 1 :(得分: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中的每个键即可。

答案 2 :(得分:1)

我通过扩展基类提供唯一(行)键来解决这个问题,使用传递的对象的属性初始化它,并添加一个带有计数器值的额外Id字段。尚未尝试但应该使用反射来自动化属性字段的副本。我很困惑为什么PF没有提供这种隐含的机制。