JPA查询返回“未为参数3指定值”,但给出了所有参数

时间:2019-06-21 12:05:06

标签: java hibernate jpa

我正在尝试创建一个查询以返回带有一些IN子句的映射,这些子句仅在Set不为空时才追加到查询字符串。

这是我的方法

public List<Object> findByFilter(String nome, DemandaStatus status, Set<Estado> estados, Set<Cidade> cidades, Set<Set<DemandaCategoria>> categorias, Set<Set<DemandaSubCategoria>> subCategorias) {

       String sqlString = "SELECT new map(d.nmDemanda as nmDemanda, d.dsDemanda as dsDemanda, d.vlDemanda as vlDemanda) "
            + "FROM Demanda as d ";
            sqlString = estados.isEmpty() ? sqlString : sqlString + "JOIN d.estado estados ";
            sqlString = cidades.isEmpty() ? sqlString : sqlString + "JOIN d.cidade cidades ";
            sqlString = categorias.isEmpty() ? sqlString : sqlString + "JOIN d.categorias categorias ";
            sqlString = subCategorias.isEmpty() ? sqlString : sqlString + "JOIN d.subCategorias subs ";

            sqlString = sqlString + "WHERE 1=1 ";

            sqlString = nome == null ? sqlString : sqlString + "AND d.nmDemanda = :nome ";
            sqlString = status == null ? sqlString : sqlString + "AND d.status = :status ";
            sqlString = estados.isEmpty() ? sqlString :  sqlString + "AND d.estado IN :estados ";
            sqlString = cidades.isEmpty() ? sqlString : sqlString + "AND d.cidade IN :cidades ";
            sqlString = categorias.isEmpty() ? sqlString : sqlString + "AND d.categorias IN :categorias ";
            sqlString = subCategorias.isEmpty() ? sqlString : sqlString + "AND d.subCategorias IN :subs ";

        Query query = em.createQuery(sqlString);

        query = nome == null ? query : query.setParameter("nome", nome);
        query = status == null ? query : query.setParameter("status", status);
        query = estados.isEmpty() ? query : query.setParameter("estados", estados);
        query = cidades.isEmpty() ? query : query.setParameter("cidades", cidades);
        query = categorias.isEmpty() ? query : query.setParameter("categorias", categorias);
        query = subCategorias.isEmpty() ? query : query.setParameter("subs", subCategorias);

        return query.getResultList();
    }

当我尝试不使用“ Estados”或“ Cidades”时,这是sqlString结果

SELECT

new map(d.nmDemanda as nmDemanda, d.dsDemanda as dsDemanda, d.vlDemanda as vlDemanda)

FROM

Demanda as d JOIN d.categorias categorias JOIN d.subCategorias subs 

WHERE 1 = 1 

AND d.nmDemanda = :nome

AND d.status = :status

AND d.categorias IN :categorias

AND d.subCategorias IN :subs

查询参数也是这4个。

这可以正常工作(或似乎可以正常工作)并按预期方式创建查询以及参数,但是我得到的是“没有为参数3指定值(或此处的其他值,当我在参数)。

0 个答案:

没有答案