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”)
- 将别名替换为表名并执行查询
- 它解释为自然连接
建议:使用字段名而不是别名。使用此结果转换器可以筛选唯一的结果:
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);