Consulta com JOIN FETCH ou LEFT JOIN FETCH - Resolvido

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 ?:

Ola,

Creio que nao precise fazer join no select, ja que no mapeamento voce esta falando que ele é eager.

1 curtida

Entendi, mas na consulta ele só retorna a entidade principal, deveria retorna as duas.

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

Mudei para e não adiantou.

@ManyToOne(targetEntity = PessoaEntity.class)
@JoinColumn(name = "FK_PESSOA", referencedColumnName = "ID_PESSOA", nullable = false)
@JsonBackReference
public PessoaEntity getPessoa() {
	return pessoa;
}

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


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

Se estás a fazer um count, não há necessidade de FETCH uma vez que não estás a devolver uma entidade. O FETCH é usado para preencher uma outra entidade que é propriedade da primeira.

Da zero para ele KIKO … kkkk

Obrigado @pmlm