2
respostas

Consulta com JOIN FETCH ou LEFT JOIN FETCH

A primeira consulta faz o SQL corretamente

SELECT COUNT(plc.id) as total FROM br.com.netsoft.model.notafiscalservico.PessoaLiberarCancelarNFSeEntity plc  LEFT OUTER JOIN plc.pessoa pesc

A segunda não

SELECT COUNT(plc.id) as total FROM br.com.netsoft.model.notafiscalservico.PessoaLiberarCancelarNFSeEntity plc  LEFT OUTER JOIN FETCH plc.pessoa pesc

A segunda ocorre este erro.

 Caused by: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=pesc,role=br.com.netsoft.model.notafiscalservico.PessoaLiberarCancelarNFSeEntity.pessoa,tableName=PESSOAS.TB_PESSOA,tableAlias=pessoaenti1_,origin=NFSE.TB_NOTA_FISCAL_LIBERAR_CANCELAR pessoalibe0_,columns={pessoalibe0_.FK_PESSOA ,className=br.com.netsoft.model.todos.PessoaEntity}}]
        at org.hibernate.hql.internal.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:227)
        at org.hibernate.hql.internal.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:937)
        at org.hibernate.hql.internal.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:705)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:665)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301)
        at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:249)
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
        ... 113 more

Modelos:

private static final long serialVersionUID = -6995479117848459720L;

        private PessoaEntity pessoa;
        private String motivo;

        @Id
        @Column(name = "ID_NOTA_FISCAL_LIBERAR_CANCELAR")
        @SequenceGenerator(name = "NFSE.SQ_NOTA_FISCAL_LIBERAR_CANCELAR", sequenceName = "NFSE.SQ_NOTA_FISCAL_LIBERAR_CANCELAR", allocationSize = 1)
        @GeneratedValue(generator = "NFSE.SQ_NOTA_FISCAL_LIBERAR_CANCELAR", strategy = GenerationType.SEQUENCE)
        public Long getId() {
            return super.getId();
        }

        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "FK_PESSOA", nullable = false)
        @JsonBackReference
        public PessoaEntity getPessoa() {
            return pessoa;
        }

        public void setPessoa(PessoaEntity pessoa) {
            this.pessoa = pessoa;
        }

        @Column(name = "DS_MOTIVO", length = 4000, nullable = false)
        public String getMotivo() {
            return motivo;
        }

        public void setMotivo(String motivo) {
            this.motivo = motivo;
        }

O que pode ser ?:

2 respostas

Você tentou fazer o fetch de um relacionamento que é ManyToOne, consequentemente o outro lado é o dono do relacionamento... No fim, você não precisa se preocupar com isso, pq o ManyToOne já é carregado automaticamente.

Na verdade, foi erro meu.

FETCH não se faz em consultas com COUNT.