您使用的是惰性数据表,这不会在页面更改时保留选择。
您需要将 selection 参数设置为您的集合类型
在您的LazyDataModel 中实现getRowKey 并删除rowKey="#{ticket.id}"
-
复选框选择不需要selectionMode="multiple"。
- 此参数仅用于在按住 CTRL 键单击表格行时进行多选
- 我的建议是手动控制您选择的数据
XHTML 文件:
<p:dataTable id="#{prefix}List"
value="#{tickets}"
lazy="true"
paginator="true"
var="ticket"
selection="#{ticketForm.selectedTickets}"
emptyMessage="Записи в данной категории отсутствуют">
<p:ajax event="toggleSelect"
listener="#{ticketForm.onAllSelect}" partialSubmit="true"/>
<p:ajax event="rowSelectCheckbox"
listener="#{ticketForm.onSelect}" update=":protocolForm"/>
<p:ajax event="rowUnselectCheckbox"
listener="#{ticketForm.onUnselect}" update=":protocolForm"/>
<p:ajax event="rowSelect"
listener="#{ticketForm.onSelect}" update=":protocolForm"/>
<p:ajax event="rowUnselect"
listener="#{ticketForm.onUnselect}" update=":protocolForm"/>
<p:column selectionMode="multiple" style="width:40px; text-align:center" />
<!--other p:columns-->
</p:dataTable>
托管 bean:
public void onRowSelect(SelectEvent event) {
if (event != null && event.getObject() != null &&
event.getObject() instanceof Ticket) {
if (selectedTickets== null) {
selectedTickets= new ArrayList<Ticket>();
}
if (!selectedTickets.contains((Ticket) event.getObject())) {
selectedTickets.add((Ticket) event.getObject());
}
}
}
public void onRowUnselect(UnselectEvent event) {
if (event != null && event.getObject() != null &&
event.getObject() instanceof Ticket &&
selectedTickets != null && selectedTickets.contains((Ticket) event.getObject())) {
selectedTickets.remove((Ticket) event.getObject());
}
}
public void onAllRowsSelect(ToggleSelectEvent event) {
//This is the trick, you don't need receive a collection
if (event.isSelected()) {
selectedTickets = ticketService.getAllTickets();
} else {
selectedTickets = new ArrayList<Ticket>();
}
}
LazyDataModelgetRowKey方法的实现:
public class LazyPragaModel extends LazyDataModel<Ticket> implements Serializable {
private TicketService ticketService;
private static final long serialVersionUID = 1L;
public LazyPragaModel(TicketService ticketService) {
this.ticketService= ticketService;
}
@Override
public Object getRowKey(Ticket ticket) {
return ticket!= null ? ticket.getId() : null;
}
@Override
public Praga getRowData(String rowKey) {
List<Ticket> tickets = (List<Ticket>) getWrappedData();
for (Ticket ticket: tickets) {
if (ticket.getId().toString().endsWith(rowKey)) {
return ticket;
}
}
return null;
}
@Override
public List<Ticket> load(int first, int pageSize, String sortField,
SortOrder sortOrder, Map<String, Object> filters) {
setRowCount(ticketService.countLazyRecords(filters).intValue());
List<Ticket> tickets = ticketService.listLazyRecords(first, pageSize,
sortField, sortOrder.name(), filters);
return tickets;
}
}
对您的服务的建议。惰性数据表的通用方法:
public List<T> listLazyRecords(int first, int pageSize, String sortField,
String sortOrder, Map<String, Object> filters) {
sortOrder = sortOrder != null ? sortOrder.contains("ASC") ? "ASC" :
sortOrder.contains("DESC") ? "DESC" : null : null;
String query = " FROM " + getType().getSimpleName() + " t " +
(filters.size() > 0 ? buildLazyFilters(filters) : "") +
(sortOrder != null ? " ORDER BY " + sortField + " " + sortOrder : "");
return getManager().createQuery(query, getType())
.setFirstResult(first).setMaxResults(pageSize).getResultList();
}
public Long countLazyRecords(Map<String, Object> filters) {
String query = "SELECT COUNT(x) FROM " + getType().getSimpleName() +
" x " + (filters.size() > 0 ? buildLazyFilters(filters) : "");
return getManager().createQuery(query).getSingleResult();
}
private String buildLazyFilters(Map<String, Object> filters) {
StringBuilder filterBuild = new StringBuilder("WHERE ");
for (Map.Entry<String, Object> filter : filters.entrySet()) {
if (filter.getValue().toString().chars().allMatch(Character::isDigit)) {
filterBuild.append("( " + filter.getKey() + " = " +
filter.getValue() + " OR ");
}
filterBuild.append(filter.getKey() + " LIKE '%" +
filter.getValue().toString() + "%'");
filterBuild.append(filter.getValue().toString().chars()
.allMatch(Character::isDigit) ? ") ": "");
filterBuild.append(!filters.values().toArray()[filters.size() - 1]
.equals(filter.getValue()) ? " AND " : "");
}
return filterBuild.toString();
}