Я пытаюсь создать запрос для возврата карты с некоторыми предложениями 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 (или других значений здесь, когда я передаю больше наборов в параметре)».