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?
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.
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();
}