我希望从以下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();
}
感谢任何帮助。
答案 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,那么这里有一个例子,假设model
和color
都代表复合键,只是为了说明这个想法:
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没有提供这种隐含的机制。