# suchen mit unbekannten werten



## Antiga (28. Mrz 2009)

Hallo,

lese aus einem Gui werte aus die ein User für eine Suche in einer Datenbank eingibt. Jetzt hab ich zb Vorname und nachname aber es muss keines von beiden eine Eingabe enthalten.
Wie mach ich das jetzt, dass ich nicht 100 search Methoden (search(Vorname), search(Nachname), search(Vorname, Nachname) schreiben muss? 

Danke für jede Hilfe


----------



## void (28. Mrz 2009)

Hi Antiga,

am besten schreibst du dir eine eigene Klasse z.B. SearchParameters die alle möglichen Parameter für deine Suche enthält und die du je nach Bedarf füllst. Dadurch brauchst du nur noch eine Methode search(SearchParameters) in der du dann die Paramter auswertest.

/void


----------



## Antiga (28. Mrz 2009)

hmmm.... die hab ich ja eigentlich schon weil ich eine entity mit gettern und settern hab, aber ich muss das ja irgendwie im sql-query lösen.
Weil angenommen ich hab einen mitarbeiter m und ich übergeb ihn dem search(m). und im search hab ich dann die sql-query drin (und natürlich die Verbindung zur datenbank). wenn jetzt aber der zb Vorname nicht gesetzt ist - also null oder ein leerer String - wie mach ich das dann? ich kann ja nich 100 sql abfragen schreiben.
Also bsp
Select * From mitarbeiter WHERE vorname = m.getVorname() AND nachname = m.getNachname();

Danke


----------



## Antiga (28. Mrz 2009)

achso ich bin ein Depp, ich kann ja den query-String ganz einfach konkatenieren. Also:
if(vorname!=null) dann query += m.getVorname()

Denkt ihr das passt so oder gibts da einen besseren Weg, weil das scheint mir ein wenig fehleranfällig


----------



## JanHH (29. Mrz 2009)

Es wird etwas unklar was Du eigentlich tun willst. Soweit ich das verstehe: Je mehr Such-Parameter man eingibt, um so genauer eingegrenzt wird die Suche. Wenn man nur als Nachname "b" eingibt, kommen alle, die als Nachname "b" haben, und wenn man auch noch als Vormane "a" eingibt, kommen alle, die als Vorname a und als Nachname b haben.

Da musst Du halt den query-String entsprechend zusammenbauen.. für alle Parameter, wo eine Eingabe erfolgt ist, ein "where xxx = yyy". Aber darau bist Du ja anscheinend auch schon selber gekommen.


----------



## hdi (29. Mrz 2009)

[HIGHLIGHT="Java"]class ParamContainer{

private Map<String,String> params;

public ParamContainer(){
    params = new HashMap<String,String>();
}

public void put(String property, String value){
    params.put(property,value);
}

public Map getParams(){
     return params;
}
}[/HIGHLIGHT]

[HIGHLIGHT="Java"]// in deiner Such-Methode erstellst du dir einen Parameter-Container und legst
// dort die Parameter rein, die in der GUI angegeben wurden, Bsp
// (das Auslesen der GUI kann und sollte man auch noch dynamischer gestalten, 
// damit das ganze hier auch einen echten Vorteil bringt)
ParamContainer myParams = new ParamContainer();
String enteredVorname = gui.getVornameField().getText();
if(enteredVorname != null && !enteredVorname.isEmpty()){
      myParams.put("vorname",enteredVorname);
}
// usw, dann:
StringBuilder query = new StringBuilder();
query.append( "SELECT * FROM MITARBEITER");
Map<String,String> params =  myParams.getParams();
// das folgende is nich so elegant gecodet, ist nur hingerotzt. Aber die Idee ist:
int count = 0;
for(String key : params.keySet()){
    query.append(count == 0 && count != params.keySet().size()-1 ? " WHERE " : " AND ");
    query.append(key+"="+params.get(key));
    count++;
}
query.append(";");
String sqlQuery = query.toString();
[/HIGHLIGHT]


----------

