Adicionando o Conjunction nos predicates, vi que ele gera uma query com 1=1 o que pode ser um problema dependendo do banco e da query, pois pode fazer com que o banco de dados não use o índice. Existe alguma solução pra isso?
Adicionando o Conjunction nos predicates, vi que ele gera uma query com 1=1 o que pode ser um problema dependendo do banco e da query, pois pode fazer com que o banco de dados não use o índice. Existe alguma solução pra isso?
Bom dia Felipe, não entendi direito qual o problema que está tento com o índice. E pode também postar sua query?
public List<Produto> getProdutos(String nome, Integer categoriaId, Integer lojaId) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Produto> query = builder.createQuery(Produto.class);
Root<Produto> root = query.from(Produto.class);
Predicate predicate = builder.conjunction();
if (categoriaId != null) {
@SuppressWarnings("unchecked")
Join<Produto,Categoria> produtoCategoriaJoin = (Join<Produto,Categoria>) root.<Produto,Categoria>fetch("categorias");
predicate = builder.and(predicate, builder.equal(produtoCategoriaJoin.<Integer> get("id"), categoriaId));
}
if (lojaId != null) {
@SuppressWarnings("unchecked")
Join<Produto,Loja> produtoLojaJoin = (Join<Produto,Loja>) root.<Produto,Loja>fetch("loja");
predicate = builder.and(predicate, builder.equal(produtoLojaJoin.<Integer> get("id"), lojaId));
}
if (!nome.isEmpty()) {
predicate = builder.and(predicate, builder.like(root.<String> get("nome"), "%" + nome + "%"));
}
return em.createQuery(query.where(predicate)).getResultList();
}
Na query gerada, no where ele gera 1 =1. Isso é bem ruim pois pode fazer com que o banco não use índices.
Query gerada: Hibernate: select produto0_.id as id1_2_0_, categoria2_.id as id1_0_1_, produto0_.descricao as descrica2_2_0_, produto0_.linkDaFoto as linkDaFo3_2_0_, produto0_.loja_id as loja_id6_2_0_, produto0_.nome as nome4_2_0_, produto0_.preco as preco5_2_0_, categoria2_.nome as nome2_0_1_, categorias1_.Produto_id as Produto_1_2_0__, categorias1_.categorias_id as categori2_3_0__ from Produto produto0_ inner join Produto_Categoria categorias1_ on produto0_.id=categorias1_.Produto_id inner join Categoria categoria2_ on categorias1_.categorias_id=categoria2_.id where 1=1 and categoria2_.id=1
Alguma resposta?