2013-10-22 4 views
1

"동적"매개 변수 집합을 사용해야하는 쿼리가 있습니다. 하지만 coundn't 그것을하는 방법을 실현, 나는 어디 문자열을 추가하려고하지만 그것은 erros를 제공하기 때문에 매개 변수가 설정되어 있습니다.최대 절전 모드 동적 매개 변수 쿼리

팁이 있습니까?

String queryS = "select object(c) from " 
          + entityClassName + " as c " + 
          "where 1 = 1" ; 

      if(codigoPaciente.compareTo("") != 0) 
      { 
       queryS += " and c.CodigoDoPaciente =:paciente"; 
      } 
      if(codServicoPrincipal.compareTo("") != 0) 
       queryS += " and c.codigoServicoPrincipal =:servico"; 
      if(data != null) 
       queryS += " and c.codigoServicoPrincipal =:data"; 
      if(TipoServico.compareTo("") != 0) 
       queryS += " and c.codigoServicoPrincipal =:tipoServico"; 


      Query query = em.createQuery(queryS); 
      query.setParameter("paciente", codigoPaciente); 
      query.setParameter("codigoServicoPrincipal", codServicoPrincipal); 
      query.setParameter("data", data); 
      query.setParameter("tipoServico", TipoServico); 


      return query.getResultList(); 

답변

0

조건에 매개 변수를 설정하지 않았습니다 ... 연결된 각 문자열에 대해 매개 변수를 설정했을 수 있습니까? 의 criteria API가보다 "안전"방식으로 쿼리를 구성하는 데 사용할 수 오히려 쿼리를 만들 문자열 연결의 무리를하는 것보다

if(codigoPaciente.compareTo("") != 0) 
      { 
       queryS += " and c.CodigoDoPaciente =:paciente"; 
      } 

Query query = em.createQuery(queryS); 

// etc etc... 
if(codigoPaciente.compareTo("") != 0) 
    query.setParameter("paciente", codigoPaciente); 
+0

다른 점; WHERE 절을 제거하고 어떤 조건이 이미 연결되었는지 확인하지 않고 AND 연결을 계속하면 으로 시작하는 기준을 갖게됩니다. 이것은 물론 당신에게 오류를 줄 것이다. –

+0

"QUERY"개체가 아직 존재하지 않기 때문에 쿼리를 작성하는 IF에 매개 변수를 설정할 수 없습니다. –

+0

if는 쿼리 개체를 분명히 만든 후에 사용하기위한 것입니다. –

2

. 그런 다음 단일 조건부 검사에 조건과 값을 추가 할 수 있습니다.

+0

나는 이것에 joel에 동의한다. –

+1

나는 나 자신과 부분적으로 만 동의한다. 기준 API는 함께 일할 기쁨이 아닙니다. – digitaljoel

+0

그것은 고통 스러울 지 모르지만 연결하는 것을 피하는 것은 대개 장기간에 돈을 지불합니다 ... –