2016-05-11 10 views
2

Ich entwickle eine Anwendung, in der ich Suchfunktionalität benötige, ich möchte HQL-Abfrage schreiben, die dynamisch nach Parametern erstellt. Momentan habe ich 4 Parameter, während die Suche nach allen Parametern erforderlich ist oder 1 oder 2 oder 3 Parameter, je nachdem, wie der Benutzer suchen möchte.dynamisch Abfrage in HQL mit optionalen Parameter?

public List<Plot> fetchSearchedPlots(int plotType, String plotSize, String min, String max) 
    { 
     Session session = sessionFactory.getCurrentSession(); 
     List<Plot> searchedLists = new ArrayList<Plot>(); 
     String query = "FROM Plot where type = ? and size = ? and price >= ? and price <= ?"; 
     searchedLists = (List<Plot>)session.createQuery(query) 
       .setInteger(0, plotType) 
       .setString(1, plotSize) 
       .setString(2, min) 
       .setString(3, max).list(); 
     return searchedLists; 
    } 

dies für alle vier Parameter meine allgemeine Abfrage, jetzt muss ich eine Suchabfrage schreiben, in dem ich mehrere optionale Parameter verwenden, wie diese Abfrage mit optionalen Parametern machen? freundlicherweise meine Abfrage in dynamisch optionale Parameter Abfrage konvertieren? Dank

+0

Vielleicht haben Sie es sich mit dieser Info umwandeln kann http://stackoverflow.com/questions/12199433/jpa-criteria-api-with-multiple-parameters – RubioRic

+0

ich denke, es nicht das, was i Ich frage – Ahmad

+0

Sind Sie sicher? Hast du die angenommene Antwort gelesen? Was ist dein genaues Problem mit dieser Antwort? Sie müssen eine CriteriaQuery erstellen, indem Sie nur die benötigten Prädikate hinzufügen. Sie können eine Liste abrufen, die die getResultList-Methode aufruft, sobald Sie Ihre Abfrage erhalten haben. – RubioRic

Antwort

2

I Konvertierte Abfrage von mir mag diese

Session session = sessionFactory.getCurrentSession(); 
     List<Plot> searchedLists = new ArrayList<Plot>(); 
     Map<String, Object> params = new HashMap<String,Object>(); 
     String hqlQuery = "from Plot where societyBlock.societyBlockId = :societyBlock"; 
     params.put("societyBlock", societyId); 
     if(plotType != null) 
     { 
      hqlQuery += " and type.typeId = :type"; 
      params.put("type", plotType); 
     } 
     if(!plotSize.isEmpty() && plotSize != null && !plotSize.equals("")) 
     { 
      hqlQuery += " and size = :size"; 
      params.put("size", plotSize); 
     } 
     if(min != null) 
     { 
      hqlQuery += " and price >= :pricemin"; 
      params.put("pricemin", min); 
     } 
     if(max != null) 
     { 
      hqlQuery += " and price <= :pricemax"; 
      params.put("pricemax", max); 
     } 
     Query query = session.createQuery(hqlQuery); 

     for (String str : query.getNamedParameters()) 
     { 
      query.setParameter(str, params.get(str)); 
     } 
     searchedLists = (List<Plot>) query.list(); 
     System.out.println(searchedLists.size()); 
     return searchedLists; 
0

Sie können weiter unten etwas tun:

Map<String, Object> parameters= new HashMap<String,Object>(); 
    parameters.put("status", status); 

    StringBuilder hql = "SELECT employee FROM Employee as employee where 1 = 1"; 
    if (status != null) { 
     hql.append(" and employee.status in :status"); 
    } 


    Query query = session.createQuery(hql.toString()); 


    for (String p : query.getNamedParameters()) { 
     query.setParameter(p, parameters.get(p)); 
    } 
+0

Ich habe davon nicht bekommen, können Sie meine Abfrage genau konvertieren? – Ahmad

2

Eine weitere Variante für dynamische Abfragen ist Criteria API zu verwenden:

Criteria crit = session.createCriteria(Plot.class); 
if (status != null) { 
     crit.add(Restrictions.eq("status", status)); 
} 
// other where clauses 

Für Ihre Variante von der Frage, mit dynamischen Kriterien Schöpfung basiert am Eingang:

Criteria criteria = session.createCriteria(Plot.class);; 
    if(type != null) { 
     criteria.add(Restrictions.eq("type", type)); 
    } 
    if(size != null) { 
     criteria.add(Restrictions.eq("size", size)); 
    } 
    if(min != null && max != null) { 
     criteria.add(Restrictions.between("price", min, max)); 
    } 
    List<Case> searchedLists = criteria.list(); 
    return searchedLists; 
+0

Ich habe davon nicht bekommen, können Sie meine Abfrage genau konvertieren? – Ahmad

+0

Kein Problem. Neue Version hinzugefügt –

+0

Wenn ein Parameter null ist, zum Beispiel, wenn die Suche nur mit type durchgeführt wird, dann sind andere Parameter null und können daher auch diese Criteria-API verarbeiten? Wenn nur Typ kommen, wird diese Abfrage nur mit Typ ausgeführt? – Ahmad