【问题标题】:primefaces datatable composite primary key multiple selection not workprimefaces数据表复合主键多选不起作用
【发布时间】:2013-10-14 03:34:57
【问题描述】:

我在使用带有复合主键的多选(复选框)的 primefaces 数据表时遇到问题 下面是我的xhtml

 <p:dataTable id="cars" var="car" value="#{setujutolakanpencairan.listmktksppencairan0}"
                     rowKey="#{car.mktksppencairan0PK}"
                     selection="#{setujutolakanpencairan.mktksppencairan0s}"   >
            <p:ajax event="rowSelectCheckbox" process="@this"/>
            <p:column selectionMode="multiple" style="width:2%" />
            <f:facet name="header">
                Click "View" button after selecting multiple to see details
            </f:facet>
            <p:column headerText="Color">
                #{car.vcKeterangan}
            </p:column>

            <f:facet name="footer">
                <p:commandButton value="View" icon="ui-icon-search"
                                 update=":form:display" oncomplete="carDialog.show()" actionListener="#{setujutolakanpencairan.outprint()}"/>
            </f:facet>
        </p:dataTable>

下面是我的背豆

private List<Mktksppencairan0> listmktksppencairan0;
private Mktksppencairan0[] mktksppencairan0s;

下面是我的getter setter

public Mktksppencairan0[] getMktksppencairan0s() {
    if (mktksppencairan0s != null) {

        for (Object asdf : mktksppencairan0s) {
            System.out.println("mktksppencairan0s mktksppencairan0s mktksppencairan0smktksppencairan0s =====" + asdf);
        }
    }
    return mktksppencairan0s;
}

public void setMktksppencairan0s(Mktksppencairan0[] mktksppencairan0s) {
    this.mktksppencairan0s = mktksppencairan0s;
}

下面是显示数据的列表

public List<Mktksppencairan0> getListmktksppencairan0() {
    TypedQuery<Mktksppencairan0> query = em.createNamedQuery("Mktksppencairan0.findBybulantahun", Mktksppencairan0.class);
    query.setParameter(
            "iTahun", mktkontrol.getTahun());
    query.setParameter(
            "iBulan", mktkontrol.getBulan());
    List<Mktksppencairan0> results = query.getResultList();
    return results;
}

public void setListmktksppencairan0(List<Mktksppencairan0> listmktksppencairan0) {
    this.listmktksppencairan0 = listmktksppencairan0;
}

这是我用来调试值的操作

 public void outprint() {

    System.out.println("asdfasdf ===" + mktksppencairan0s.toString().length());
    System.out.println("asdfasdf ===" + mktksppencairan0s.toString());
    System.out.println("asdfasdf ===" + mktksppencairan0s);
    for (Mktksppencairan0 asdf : mktksppencairan0s) {
        System.out.println("mktksppencairan0s mktksppencairan0s mktksppencairan0smktksppencairan0s =====" + asdf.toString().length());
    }
}

当我使用 netbeans 调试器进行调试时,结果为 [] 或 0 当我 System.out 它的结果

INFO: asdfasdf ===[Lcom.infion.web.biaya_marketing.entity.Mktksppencairan0;@a20a9b
INFO: asdfasdf ===64

INFO: asdfasdf ===[Lcom.infion.web.biaya_marketing.entity.Mktksppencairan0;@1f5db6
INFO: asdfasdf ===[Lcom.infion.web.biaya_marketing.entity.Mktksppencairan0;@1f5db6

仅供参考,我使用的是 netbeans 7.3、glassfish 3.1.2、primefaces 3.5 * 我使用的实体是由 netbean 生成的,所以有两类实体 Mktksppencairan0PK 和 Mktksppencairan0 ,其中 Mktksppencairan0 嵌入了 Mktksppencairan0PK 谢谢你帮助我

注意:我尝试使用非复合主键(单个主键)及其工作,但是当我尝试使用另一个复合主键时它不起作用

【问题讨论】:

    标签: jsf netbeans primefaces datatable


    【解决方案1】:

    您需要将 selectionMode 设置为“multiple”,正如@dmatos 提到的那样,并且 rowkey 必须返回每行的唯一标识符,并且它需要保持一致。如果它变得比访问 rowKey 中的唯一字段更复杂,您总是可以在 primefaces 中实现 selectabledatamodel。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,但我一如既往地使用实体列表。

      private List<SipreTmpGuardia> beanList;
      private List<SipreTmpGuardia> beanListSelected;
      

      然后我在我的数据表中设置了多种选择模式:

          <!-- DATATABLE-->
                      <p:dataTable id="dt" var="item" widgetVar="wdt"
                          rowIndexVar="rowIndex"
                          value="#{guardia.beanList}"
                          emptyMessage="#{constantesUtil.LIST_EMPTY}" paginator="true"
                          rows="20" paginatorPosition="top"
                          paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} "
                          selection="#{guardia.beanListSelected}" rowKey="#{item.codigoRowIndexTemp}"
                            >
                          <p:column headerText="N*" width="1%">
                              <h:outputText value="#{rowIndex+1}" />
                          </p:column>
                          <p:column selectionMode="multiple"  width="1%"/>
                          <p:column headerText="Indicador Mes o Reintegro" width="2%">
                              <h:outputText value="#{item.ctgIndSituacion==2?'Reintegro':'Proceso Mes'}" />
                          </p:column>
      
                          <f:facet name="footer">
                      <p:commandButton ajax="false" action="#{guardia.saveListTmpGuardia()}" update=":frm:messages,:frm:dt,:frm:dtGM" icon="ui-icon-search" value="Guardar Seleccionados"  />
              </f:facet>
                      </p:dataTable>
      

      编辑: 我知道 primefaces 5 中的 RowKey 不支持复合主键。 上面我所做的是设置 rowKey="#{item.codigoRowIndexTemp}" 并将其填充到填充我的表的函数中 .. value="#{guardia.beanList}" 。

      不需要设置复合主键,只需在您的实体中创建一个临时属性,如“codigoRowIndexTemp”,然后填充它.. 当您选择它时,它将按您的 codigoRowIndexTemp 过滤您的列表。

      试试吧!

      顺便说一句: 我的复合主键或 EmbeddedId 是:

      @EmbeddedId
      protected SipreTmpGuardiaPK sipreTmpGuardiaPK;
      

      【讨论】:

        猜你喜欢
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 2015-06-05
        • 2014-08-30
        • 2012-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多