QuerySyntaxException在EntityManager createQuery上的hibernate无效路径

时间:2018-04-20 19:27:37

标签: java hibernate exception entitymanager createquery

我从前端发送一个值来搜索我的实体 Producto 的两个属性。这些属性是 Codigo Descripcion

问题是当行TypedQuery<Long> typedQuery = em.createQuery(queryCount);命中时,抛出此异常:

  

queryString = org.hibernate.hql.internal.ast.QuerySyntaxException:路径无效:   'generatedAlias1._codigo'[select count(generatedAlias0)from   com.its.entidades.db.Producto as generatedAlias0其中(   generatedAlias1._codigo like:param0)and(   generatedAlias1._descripcion like:param1)]

           

detailMessage =路径无效:'generatedAlias1._codigo'

奇怪的是,如果我评论引用的行,结果下面的两行,一切都按预期运行。 但是我需要对寄存器的总数进行过滤,所以我需要对它们进行计数。

ProductoService.java

@Override
public ServiceResponse<List<Producto>> ObtenerListaPaginada(ParametrosListadoModelo parametros) {

    ServiceResponse<List<Producto>> ret = new ServiceResponse<>();
    ret.setListadoModelo(parametros);

    try {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Producto> query = cb.createQuery(Producto.class);

        CriteriaQuery<Long> queryCount = cb.createQuery(Long.class);
        queryCount.select(cb.count(queryCount.from(Producto.class)));

        Root<Producto> entity = query.from(Producto.class);
        TypedQuery<Producto> tq = null;

        if (parametros.getBusqueda() != null && !parametros.getBusqueda().isEmpty()) {
            String queryFilter = "%" + parametros.getBusqueda() + "%";

            List<Predicate> predicates = new ArrayList<>();
            predicates.add(cb.like(entity.<String>get("_codigo"), queryFilter));
            predicates.add(cb.like(entity.<String>get("_descripcion"), queryFilter));

            query.where(predicates.toArray(new Predicate[]{}));
            queryCount.where(predicates.toArray(new Predicate[]{}));
        }

        // Count for total
        TypedQuery<Long> typedQuery = em.createQuery(queryCount);
        Long count = typedQuery.getSingleResult();
        ret.getListadoModelo().setTotalRegistros(count);

        // Order by
        if (parametros.getCampoOrdenamiento().equals("codigo"))
            parametros.setCampoOrdenamiento("_codigo");
        if (parametros.getCampoOrdenamiento().equals("descripcion"))
            parametros.setCampoOrdenamiento("_descripcion");

        query.orderBy(parametros.getDireccionOrdenamiento().equals("ASC") ? cb.asc(entity.get(parametros.getCampoOrdenamiento())) : cb.desc(entity.get(parametros.getCampoOrdenamiento())));

        // Paginator
        tq = em.createQuery(query);
        tq.setFirstResult((int) ((parametros.getNumeroPagina() - 1) * parametros.getCantidadElementos()));
        tq.setMaxResults((int) (parametros.getCantidadElementos()));
        ret.setData(tq.getResultList());
    } catch (Exception ex) {
        ret.getErrores().add(new ServicioError(ex));
    }

    return ret;
}

Producto.java

@Entity(name = "Producto")
public class Producto {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ProductoID")
    private int _productoID;

    @Column(name = "cCodigo")
    private String _codigo;

    @Column(name="cDescripcion")
    private String _descripcion;

    @JsonProperty("codigo")
    public String getCodigo() {
        return _codigo;
    }

    @JsonProperty("codigo")
    public void setCodigo(String _codigo) {
        this._codigo = _codigo;
    }

    @JsonProperty("descripcion")
    public String getDescripcion() {
        return _descripcion;
    }

    @JsonProperty("descripcion")
    public void setDescripcion(String _descripcion) {
        this._descripcion = _descripcion;
    }
}

为什么会这样?

1 个答案:

答案 0 :(得分:1)

最后解决了重构:

try{
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Producto> query = cb.createQuery(Producto.class);

    CriteriaQuery<Long> queryCount = cb.createQuery(Long.class);
    Root<Producto> entityRoot = queryCount.from(query.getResultType());
    queryCount.select(cb.count(entityRoot));

    Root<Producto> entity = query.from(Producto.class);
    TypedQuery<Producto> tq;
    //And the rest of the code is the same as the original one.
    //...
}