Oi pessoal, já resolvi o problema aqui, não foi pelo sql, mas funcionou do jeito esperado. Vou explicar a anotação ?1 ,?2, ?etc
Supondo que eu tenho uma namedQuery gerada automaticamente pelo netbeans:
@NamedQuery(name = "OsRegistros.findByNumOsData", query = "SELECT o FROM OsRegistros o WHERE o.numOs = :numOs and o.data = :data")
vou transformá-la assim:
@NamedQuery(name = "OsRegistros.findByNumOsData", query = "SELECT o FROM OsRegistros o WHERE o.numOs = ?1 and o.data = ?2")
dessa forma eu tenho a sequência de parâmetros que eu terei de passar.
A minha classe terá esse cabeçalho:
public List getListaComParametros(String namedQuery, List parametros)
onde eu passarei o nome da minha query, e uma lista de parâmetros para ela. Como no exemplo, vou passar assim:
List<OsRegistros> reg = new ArrayList<OsRegistros>();
List minhaLista = new ArrayList();
lista.add(numDaOsASerFiltrado);
lista.add(dataASerFiltrada);
reg = meuDAO.getListaComParametros("OsRegistros.findByNumOsData", lista);
assim ele vai pegar o primeiro item da lista, o parametro 1 (?1) e colocar la, e o segundo (?2) no seu devido lugar também.
Agora para colocar o parâmetro correto, eu lanço apenas um laço for para ser atribuido os valores, sendo que a query ja foi feita.
q.setParameter(i + 1, parametros.get(i));
podem ser N parâmetros, mas ele vai listando de acordo com a ordem ?x.
— A resolução do meu problema foi da maneira tosca, mas a que funcionou pra pressa do momento —
public void consultarOS() {
ArrayList list = new ArrayList();
String qData = "", qMatricula = "", qStatus = "", qServico = "", qNumOs = "";
String query=" where";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
if (txNumOS.length() != 0){qNumOs = " o.numOs=" + txNumOS ;list.add(qNumOs);}
if (data != null){qData = " o.data='" + sdf.format(data) + "'";list.add(qData);}
if (!matricula.equals("0")){qMatricula = " o.funFuncionario.matricula='" + matricula + "'";list.add(qMatricula);}
if (!status.equals("0")){qStatus = " o.status='" + status + "'";list.add(qStatus);}
if (!servico.equals("0")){qServico = " o.tipoServico='" + servico + "'";list.add(qServico);}
if (list.isEmpty()){query = "";}
if (list.size() == 1){query += list.get(0);}
if (list.size() == 2){query += list.get(0) + " and " + list.get(1);}
if (list.size() == 3){query += list.get(0) + " and " + list.get(1) + " and " + list.get(2);}
if (list.size() == 4){query += list.get(0) + " and " + list.get(1) + " and " + list.get(2) + " and " + list.get(3);}
if (list.size() == 5){query += list.get(0) + " and " + list.get(1) + " and " + list.get(2) + " and " + list.get(3) + " and " + list.get(4);}
System.out.print(txNumOS.length() + " " + data + " " + matricula + " " + status + " " + servico);
System.out.print(query);
listOS = cdao.getFromQuery("select o from OsRegistros o" + query, OsRegistros.class);
}
como a quantidade de parâmetros é pouca e eu não tive tempo de pensar em como otimizar o código, que o tempo aqui está corrido, essa foi a forma que atendeu.
Tá aqui o dao:
public List getFromQuery(String Query, Class<?> resultClass) {
List resultado = null;
try {
q = em.createQuery(Query, resultClass);
resultado = q.getResultList();
} catch (Exception Ex) {
log.addLog(Calendar.getInstance().getTime() + "[Erro na classe de controle no método: ]{getFromQuery}: " + Ex.getMessage());
}
return resultado;
}
vlw a atenção gente!