0

我已经组装了以下类规范:

 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"

如果有人可以帮我制作这个吗?

下面是 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 vendedorand组成的键Produto produto

在 Produto 类中,我有一个 List Categorias。对于一个产品可以属于几个类别。

反过来,Class 类别具有id.

我想在规范中添加的是一种获取在其类别列表中具有某些类别的所有 ItemVendedor 的方法,这些类别我在另一个列表列表类别中作为参数引用。

4

1 回答 1

0

我把它整理好了。我以错误的方式使用查询。下面是解析的代码:

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

这样我们就可以进行验证,以了解产品是否具有在参数范围内的某些类别,这是实现某些连接所必需的。

第一个 Join 与类代码中的 id 相关,ItemSeller 表中的这个字段实际上是一个复合键(@ Embeddable)类,反过来这个类必须执行与 Products 类的连接,它有类别字段。

因此,如果我们在通知查询参数中有此列表的任何元素,我们可以获取每个产品的类别列表并购买。

于 2018-05-23T06:50:22.763 回答