2016-03-08 71 views
1

我使用的是hibernate spring,我需要在條件上生成查詢。Spring Hibernate生成動態查詢

DAO.java

public ReturnData updateUserDetails(Users users, String mailID) 
{ 
    if(!users.getImageURL().equals("")) 
    { 
     Query query = this.sessionFactory.getCurrentSession().createQuery("UPDATE users SET emailID=:email_ID, name=:name, imageURL=:imageURL WHERE emailID=:emailID") 
     //setString.... 

    } 
    else 
    { 
     Query query = this.sessionFactory.getCurrentSession().createQuery("UPDATE users SET emailID=:email_ID, name=:name WHERE emailID=:emailID") 
     //setString.... 

    } 
} 

在上面的代碼中,我檢查是否圖像也已經被上傳或沒有。基於這種情況,我必須動態生成查詢。我必須重寫整個代碼以查詢+執行2次。這是好方法,還是有更好的方法來做到這一點?

+0

確實ImageURL列允許空值? – Bhushan

+0

@Bhushan,是的,它確實允許空值。假設,如果列中存在舊值,則會在其上放置空值。 –

回答

1

如果查詢條件不爲空,您可以動態追加查詢條件到查詢字符串。獲取最終條件列表後,您可以創建Hibernate查詢。

 StringBuilder sqlQuery = new StringBuilder(); 
     Map<String,Object> parameters = new HashMap<String,Object>(); 
     boolean isFirstSearchCriterion = true; 
     sqlQuery.append("UPDATE users"); 


     if(email_ID!= null && !email_ID.trim().equals("")) { 
      if(isFirstSearchCriterion) { 
       sqlQuery.append(" set emailID= :email_ID"); 
      } else { 
       sqlQuery.append(" and emailID= :email_ID"); 
      } 
      parameters.put("email_ID",email_ID); 
      isFirstSearchCriterion = false; 
     } 

     if(name!= null && !name.trim().equals("")) { 
      if(isFirstSearchCriterion) { 
       sqlQuery.append(" set name= :name"); 
      } else { 
       sqlQuery.append(" and name= :name"); 
      } 
      parameters.put("name",name); 
      isFirstSearchCriterion = false; 
     } 

     if(imageURL!= null && !imageURL.trim().equals("")) { 
      if(isFirstSearchCriterion) { 
       sqlQuery.append(" set imageURL= :imageURL"); 
      } else { 
       sqlQuery.append(" and imageURL= :imageURL"); 
      } 
      parameters.put("imageURL",imageURL); 
      isFirstSearchCriterion = false; 
     } 


      Query query = this.sessionFactory.getCurrentSession().createQuery(sqlQuery); 


     Set<String> parameterSet = parameters.keySet(); 
     for (Iterator<String> it = parameterSet.iterator(); it.hasNext();) { 
      String parameter = it.next(); 
      query.setParameter(parameter, parameters.get(parameter)); 
     } 
0

您可以簡單地做,而無需檢查空字符串,如果用戶有圖像URL它將添加在列中否則空的URL將傳遞。

public ReturnData updateUserDetails(Users users, String mailID) 
{ 
    Query query = this.sessionFactory.getCurrentSession().createQuery("UPDATE users SET emailID=:email_ID, name=:name, imageURL=:imageURL WHERE emailID=:emailID") 
     query.setParameter("imageURL",users.getImageURL(), Hibernate.STRING); 

} 
+0

我不能這樣做,因爲它會用null更新已存在的imageURL。 –

+0

您可以前往條件查詢並有條件地向查詢添加添加條件。 – Bhushan