Left join em JPQL

Ola, vi que tem varios topicos aqui sobre, mas nenhum é o meu caso.

Eu quero montar uma query com left join. Nao sei porque mas se eu fizer o select dessa forma nao funciona:

select f.referencia, p.ean,p.descricao from produto p  
	left join itensfornecedor f on p.idproduto=f.idproduto
		where p.ean=7894900010015  and idfornecedor=57;

A JPQL esta justamente traduzindo a query dessa forma.

@Query("select new dto.ProdutoConsulta(p.id,p.ean,p.descricao, pp.precoCusto, pf.codigoFornecedor)"
		+ " from Produto p join p.produtosEmpresa pp left join p.produtosFornecedor pf where pp.empresa.id =:idLoja"
		+ " and p.ean in (:codigos) and pf.fornecedor.id=:idFornecedor")
public List<ProdutoConsulta> listarProdutosPorEan(@Param("codigos") Set<Long> codigos, @Param("idLoja") Long idLoja,
		@Param("idFornecedor") Long idFornecedor);

eu so consegui fazer esse select funcionar dessa forma, colocando o idFornecedor no ON do join

    select f.referencia, p.ean,p.descricao from produto p  
	left join itensfornecedor f on p.idproduto=f.idproduto and idfornecedor=57
		where p.ean=7894900010015;

nesse caso como eu vou conseguir fazer com que a jpa traduza a query dessa forma se eu nao especifico ON no join dela?

Mas você especifica o where…

pois é, coloquei no where. mas se eu tirar onde vou informar o fornecedor que eu quero limitar a consulta? se nao tem on, tem que ser no where

Mas isso foi o que eu disse.
Para corroborar com o que eu mesmo falei:


https://respostas.guj.com.br/6074-como-fazer-um-left-join-usando-jpql-ou-criteria

eu vi isso, inclusive estava lendo o manual da jpa. Acredito que o problema esta na estrutura da tabela do banco. Pq se eu usar esses exemplos de left join ele so tras as informacoes que estão na interseção, como se fosse um inner join.

agora se eu usar uma subquery ou colocar o id do fornecedor no ON funciona.

select p.ean, f.referencia from produto p 
   left outer join 
      (select idproduto, referencia from itensfornecedor  where idfornecedor=10) f  
      on p.idproduto=f.idproduto
           where p.ean in (1, 2, 3, 5, 6, 10);

funciona perfeitamente, bem como no exemplo que postei com o idfornecedor no ON.

agora se eu usar os exemplos do left join, nao funciona.

vou abrir dos peito e fazer uma nativeQuery = “true”

Usei uma query nativa, e criei uma projection. problema resolvido.

@Repository
public interface Produtos extends JpaRepository<Produto, Long> {

    @Query(value = "select p.idproduto,p.ean,p.descricao, pp.custo, pf.referencia"
		+ " from produto p"
		+ " inner join produto_preco pp on p.idproduto=pp.idproduto and pp.id_loja=:idLoja"
		+ " left join itensfornecedor pf on p.idproduto=pf.idproduto and pf.idfornecedor=:idFornecedor"
		+ " where p.ean in (:codigos)", nativeQuery = true)
    public List<TrocaFornecedorItem> listarProdutosPorEan(@Param("codigos") Set<Long> codigos, @Param("idLoja") Long idLoja,
		@Param("idFornecedor") Long idFornecedor);
}


public interface TrocaFornecedorItem {

    public Long getIdProduto();

    public Long getEan();

    public String getDescricao();

    public BigDecimal getCusto();

    public String getReferencia();
}
1 curtida

Muito mais prático mesmo usar SQL do que JPQL.