Hibernate 扩展数据表在primefaces中重复值

Hibernate 扩展数据表在primefaces中重复值,hibernate,jsf,primefaces,Hibernate,Jsf,Primefaces,我有一个问题,如果我使用Hibernate的createAlias,我的datatable重复值,但如果我不使用它,它不会显示重复值 我的页面代码: <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&

我有一个问题,如果我使用
Hibernate
createAlias
,我的
datatable
重复值,但如果我不使用它,它不会显示重复值

我的页面代码:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<ui:composition 
    template="/template/common/pagelayout.xhtml" 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:ez="http://java.sun.com/jsf/composite" 
    xmlns:p="http://primefaces.org/ui"
    xmlns:sec="http://www.springframework.org/security/facelets/tags">

    <ui:define name="content">
        <div id="content">

            <f:metadata>
                <f:event listener="#{emitenteListBean.helper.fillDefaults()}" type="preRenderView" />
            </f:metadata>

            <br />

            <div class="form_title">
                <span class="active"> <p:outputLabel value="Filtro de Notas Fiscais"/> </span>
            </div>
            <br />

            <h:form id="list">

                <p:messages id="messages"/>

                <p:panelGrid styleClass="panelGridCenter noBorders">

                    <p:row>
                        <p:column styleClass="columnRight">
                            <p:outputLabel value="Emitente"/>
                        </p:column>

                        <p:column>
                            <p:selectOneMenu value="#{emitenteListBean.filter.emitente}" label="Emitente" converter="emitenteConverter" filter="true" filterMatchMode="contains">
                                <f:selectItem itemLabel="" itemValue="#{null}" noSelectionOption="true"/>
                                <f:selectItems var="emitente" value="#{emitenteListBean.listaEmitentes}" itemLabel="#{emitente.dadosEmpresa.cnpj} - #{emitente.dadosEmpresa.razaoSocial}"/>
                            </p:selectOneMenu>
                        </p:column>
                    </p:row>

                    <p:row>
                        <p:column styleClass="columnRight">
                            <p:outputLabel value="Numero da Nota Fiscal"/>
                        </p:column>

                        <p:column>
                            <p:inputText maxlength="10" size="15" value="#{emitenteListBean.filter.numeroNota}" onkeypress="mascara(this,soNumeros)"/>
                        </p:column>
                    </p:row>

                    <p:row>
                        <p:column styleClass="columnRight">
                            <p:outputLabel value="Data de Emissão da Nota Fiscal"/>
                        </p:column>

                        <p:column>
                            <p:calendar locale="pt_BR" pattern="dd/MM/yyyy"  label="Data de Emissão da Nota Fiscal"  value="#{emitenteListBean.filter.dataEmissaoNota}"/>
                        </p:column>
                    </p:row>

                    <f:facet name="footer">
                        <p:row>
                            <p:column colspan="2">
                                <div align="right">
                                    <p:commandButton value="Filtrar" actionListener="#{emitenteListBean.buscar}" update="tabela messages" ajax="false"/>
                                </div>
                            </p:column>
                        </p:row>
                    </f:facet>
                </p:panelGrid>

                <br/>
                <div class="form_title">
                    <span class="active"> <p:outputLabel value="Notas Fiscais Cadastradas"/> </span>
                </div>

                <br/><br/>

                <p:dataTable

                    id="tabela"
                    var="emitente"
                    value="#{emitenteListBean.lazyModel}"
                    emptyMessage="Nenhum emitente cadastrado"
                    lazy="true"
                    rows="10"
                    paginator="true"
                    paginatorPosition="bottom"
                    paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                    rowsPerPageTemplate="5,10,15">

                    <f:facet name="header">  
                        <h:outputText value="Notas Fiscais por Emitente"/>
                    </f:facet>

                    <p:column style="width:2%">
                        <p:rowToggler/>
                    </p:column>

                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Razão Social - CNPJ"/>
                        </f:facet>
                        <h:outputText value="#{emitente.dadosEmpresa.razaoSocial} - #{emitente.dadosEmpresa.cnpj}" />
                    </p:column>

                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Quantidade de Notas Fiscais"/>
                        </f:facet>
                        <h:outputText value="#{emitente.notasFiscais.size()}" />
                    </p:column>

                    <p:rowExpansion>

                        <p:dataTable
                            id="tabelaNotasFiscais" 
                            value="#{emitente.notasFiscais}" 
                            styleClass="noBorders"
                            var="notaFiscal" 
                            lazy="true" 
                            emptyMessage="Nenhuma nota fiscal está cadastrada." 
                            rows="#{emitente.notasFiscais.size()}">

                            <p:column headerText="Numero da Nota Fiscal">
                                <h:outputText value="#{notaFiscal.numero}"/>
                            </p:column>

                            <p:column headerText="Série da Nota Fiscal">
                                <h:outputText value="#{notaFiscal.serie}"/>
                            </p:column>

                            <p:column headerText="Data de Emissão">
                                <h:outputText value="#{notaFiscal.dataEmissao}">
                                    <f:convertDateTime pattern="dd/MM/yyyy" />
                                </h:outputText>
                            </p:column>

                        </p:dataTable>

                    </p:rowExpansion>

                </p:dataTable>

                <br />
                <br />

            </h:form>

        </div>
    </ui:define>
</ui:composition>
所以我的注册表重复

我理解这个问题,但我不知道如何解决这个问题,如果我有一个寄存器重复六次,它将显示六次

我有一对多的关系

我的sql hibernate代码

Hibernate: 
select
this_.id as id1_4_6_,
this_.cnae as cnae2_4_6_,
this_.dados_empresa_id as dados_em6_4_6_,
this_.inscricao_estadual_substituto_tributario as inscrica3_4_6_,
this_.inscricao_municipal as inscrica4_4_6_,
this_.nome_fantasia as nome_fan5_4_6_,
dadosempre3_.id as id1_2_0_,
dadosempre3_.cnpj as cnpj2_2_0_,
dadosempre3_.cpf as cpf3_2_0_,
dadosempre3_.endereco_id as endereco6_2_0_,
dadosempre3_.inscricao_estadual as inscrica4_2_0_,
dadosempre3_.razao_social as razao_so5_2_0_,
endereco4_.id as id1_5_1_,
endereco4_.bairro as bairro2_5_1_,
endereco4_.cep as cep3_5_1_,
endereco4_.complemento as compleme4_5_1_,
endereco4_.logradouro as logradou5_5_1_,
endereco4_.municipio as municipi6_5_1_,
endereco4_.numero as numero7_5_1_,
endereco4_.telefone as telefone8_5_1_,
endereco4_.uf as uf9_5_1_,
notasfisca1_.id as id1_6_2_,
notasfisca1_.arquivo_nota_fiscal_id as arquivo15_6_2_,
notasfisca1_.chave_nfe as chave_nf2_6_2_,
notasfisca1_.data_emissao as data_emi3_6_2_,
notasfisca1_.data_hora_entrada_ou_saida_produto as data_hor4_6_2_,
notasfisca1_.descricao_natureza_operacao as descrica5_6_2_,
notasfisca1_.destinatario_id as destina16_6_2_,
notasfisca1_.digest_value as digest_v6_6_2_,
notasfisca1_.emitente_id as emitent17_6_2_,
notasfisca1_.finalidade_emissao as finalida7_6_2_,
notasfisca1_.identificador_processo_emissao as identifi8_6_2_,
notasfisca1_.numero as numero9_6_2_,
notasfisca1_.serie as serie10_6_2_,
notasfisca1_.tipo_emissao as tipo_em11_6_2_,
notasfisca1_.tipo_operacao as tipo_op12_6_2_,
notasfisca1_.valor_icms as valor_i13_6_2_,
notasfisca1_.valor_nota_fiscal as valor_n14_6_2_,
arquivonot6_.id as id1_0_3_,
arquivonot6_.conteudo as conteudo2_0_3_,
arquivonot6_.data_registro as data_reg3_0_3_,
arquivonot6_.nome as nome4_0_3_,
destinatar7_.id as id1_3_4_,
destinatar7_.dados_empresa_id as dados_em4_3_4_,
destinatar7_.email as email2_3_4_,
destinatar7_.inscricao_suframa as inscrica3_3_4_,
emitente8_.id as id1_4_5_,
emitente8_.cnae as cnae2_4_5_,
emitente8_.dados_empresa_id as dados_em6_4_5_,
emitente8_.inscricao_estadual_substituto_tributario as inscrica3_4_5_,
emitente8_.inscricao_municipal as inscrica4_4_5_,
emitente8_.nome_fantasia as nome_fan5_4_5_ 
from
emitente this_ 
left outer join
dados_empresa dadosempre3_ 
on this_.dados_empresa_id=dadosempre3_.id 
left outer join
endereco endereco4_ 
on dadosempre3_.endereco_id=endereco4_.id 
inner join
nota_fiscal notasfisca1_ 
on this_.id=notasfisca1_.emitente_id 
left outer join
arquivo_nota_fiscal arquivonot6_ 
on notasfisca1_.arquivo_nota_fiscal_id=arquivonot6_.id 
left outer join
destinatario destinatar7_ 
on notasfisca1_.destinatario_id=destinatar7_.id 
left outer join
emitente emitente8_ 
on notasfisca1_.emitente_id=emitente8_.id limit ?

那么问题出在哪里呢?

通过创建条件,您正在使用一个类似于自然连接的条件。尝试打印实际执行的SQL查询(通过在config.xml中将SQL打印添加为true),以便用户可以看到实际执行的查询

i、 e

  • 为表的字段创建别名(pojo.notasFiscais,“nf”)
  • 表id用于条件(“pojo.id”)中
  • 还有别名 (“nf.numero”和“nf.dataEmissao”)
用户希望翻译是直接的

  • 将别名替换为表名并执行查询
但是,转换是以另一种方式进行的,它被协商到translatorfactory实现,而translatorfactory实现的行为并不符合预期

  • 它解释为自然连接

建议:使用字段名而不是别名。

使用此结果转换器可以筛选唯一的结果:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

为什么你认为问题出在JSF/PrimeFaces上?这只是这里的数据呈现者。如果获得/提供的数据首先是错误的,那么JSF/PrimeFaces没有什么可以反对的。我在列表中看到了日期,它是正确的……我没有告诉它是PrimeFaces,我不知道有什么错,但是当我从Hibernate使用createAlias时我发现这个错误primefaces网格的lazyMode不会导致重复,这似乎是查询的问题,下面的transformer bellow消除了查询中的重复项。您看到转换了吗…它两次加入同一个实体“emittente”…您能试着在sql IDE中运行这个查询,看看得到了什么吗(你会得到重复)@user2283439你看到转换了吗?…它加入了同一个实体两次“emittente”…你能试着在sql IDE中运行这个查询,看看你得到了什么(你会得到重复)…所以要么不要像建议的那样使用别名(这可能不起作用),要么使用不同的条件…(如@jhadesdev所建议的)…结论是,问题在于查询,而不是jsf
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);