3
respostas

Conjunction e índices do banco de dados

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?

3 respostas

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?