我正在尝试创建一个查询以返回带有一些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指定值(或此处的其他值,当我在参数)。