2013-10-22 67 views
1

我有一個需要使用「動態」參數集的查詢。 但coundn't意識到如何做到這一點,我試圖不添加在哪裏字符串,但它給了我erros,因爲參數sets。休眠動態參數查詢

任何提示?

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

你沒有設置你的參數,如果條件......可能設置參數爲每個字符串連接?

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

而不是做一串字符串連接來創建一個查詢時,criteria API可以用來構建一個更「安全」的方式查詢。然後,您可以在單個條件檢查中添加條件和值。

+0

我同意喬爾在此。 –

+1

我只是部分贊同我自己。標準API是沒有喜悅的工作。 – digitaljoel

+0

這可能是一種痛苦,但避免串連的東西通常會在長期運行中得到回報...... –