Spring Data JPA - запрос со спецификацией (Join и IN) - PullRequest
0 голосов
/ 22 мая 2018

Я собрал следующую спецификацию класса:

 public ItemVendedorSpecification(String descricao, List<Long> categorias, List<Long> fabricantes, List<Long> vendedores) {
        super();
        this.descricao = descricao;
        this.categorias = categorias;
        this.fabricantes = fabricantes;
        this.vendedores = vendedores;
    }

    @Override
    public Predicate toPredicate(Root<ItemVendedor> root, CriteriaQuery<?> query, CriteriaBuilder builder) {

        if (!descricao.isEmpty()) {
            String PalavraChave[] = descricao.split(" ");
            for (String filtro : PalavraChave) {
                predicates.add(builder.like(builder.upper(root.get("id").get("produto").get("descricaoDetalhada")), "%" + filtro.toUpperCase() + "%"));
            }
        }

        predicates.add(builder.isTrue(root.get("disponivel")));

        if(!fabricantes.isEmpty()) {
            predicates.add(root.get("id").get("produto").get("fabricante").get("id").in(fabricantes));
        }

        if(!vendedores.isEmpty()) {
            predicates.add(root.get("id").get("vendedor").get("id").in(vendedores));

        }

        if(!categorias.isEmpty()) {
            predicates.add(root.join("id").get("produto").get("categorias").get("id").in(categorias));
        }

        return builder.and(predicates.toArray(new Predicate[1]));
    }
}

Почти все предикаты работают, кроме того, который вставляет критерии категории.Он не работает, и мне трудно его создать.

В том смысле, что он возвращает следующую ошибку:

"Illegal attempt to dereference path source [null.produto.categorias] of basic type; nested exception is java.lang.IllegalStateException: Illegal attempt to dereference path source [null.produto.categorias] of basic type"

Может ли кто-нибудь помочь мне в создании этого if?

Ниже приведена подробная информация о классе ItemSeller:

public class ItemVendedor implements Serializable{

    private static final long serialVersionUID = 1L;


    private ItemVendedorPK id = new ItemVendedorPK();
    private BigDecimal preco;
    private Boolean disponivel;
    private Date dt_insert;
    private Date dt_update;
    private BigDecimal desconto;

    public ItemVendedor() {

    }

    public ItemVendedor(Produto produto, Vendedor vendedor, BigDecimal preco, BigDecimal desconto ,Boolean disponivel) {
        super();
        this.id.setProduto(produto);
        this.id.setVendedor(vendedor);
        this.preco = preco;
        this.disponivel = disponivel;
        this.desconto = desconto;
    }

//GETs and SETs

Как вы можете видеть, в нем есть поле с именем id, которое представляет собой ключ, состоящий из Vendedor vendedor и Produto produto.

Внутри класса Produto у меня есть список категорий.Для продукта может принадлежать несколько категорий.

В свою очередь категория Класс имеет id.

То, что я хочу добавить в Спецификацию, это способ получить все ItemVendedor, которые имеютв их списке категорий - категория, которую я привел в качестве параметра в другом списке. Список категорий.

1 Ответ

0 голосов
/ 23 мая 2018

Я разобрался.Я неправильно использовал запрос.Ниже приведен код для разрешения:

  predicates.add (root.join ("id") join ("product") join ("categories") get ("id") in (categories));

Чтобы мы могли выполнить проверку, чтобы узнать, была ли у продукта некоторая категория, которая находилась в параметре, было необходимо реализовать некоторые объединения.

Первое Соединение связано с тем, что в коде класса это как id, это поле в таблице ItemSeller на самом деле является классом для составного ключа (@ Embeddable), в свою очередь, этот класс должен был выполнить соединение с классом Products., в котором было поле Категории.

Таким образом, мы можем перейти к списку категорий каждого продукта и, таким образом, купить, если у нас есть какой-либо элемент этого списка в параметре информированного запроса.

...