# Abfrage von Teilnehmern



## Generic1 (25. Mai 2011)

Hallo,

ich habe eine Search- Form, mittels der man mehrere Abfragen machen kann -> die Methode dahinter schaut so aus:


```
searchParticipant(final String searchName, final String relayName, final String searchChoosen, final String eventNameAndTime) {
```

Das einzige was nicht null sein kann bei den Parametern dieser Methode ist eventNameAndTime, alles andere kann null sein.
Jetzt müsste ich einen Haufen if bzw. else if's machen:

if(!"".equals(seachName) && "".equals(relayName) && searchChoosen == null)
usw ...


-> die SQL- Anweisungen schauen ja je nach eingabe verschieden aus, z.B.: wenn nur ein relayname eingegeben wird:


```
String searchQuery = "select p from " + PARTICIPANT + " as p, " + PARTICIPANCE + " as pa, " + EVENT + " as e " +
                                               " where p = pa.participant and pa.event = e" +
                                               " and e.eventname = ?" +
                                               " and e.eventtime = ?" +
                                               " and pa.relayname LIKE ?";
```

Meine Frage wäre jetzt, kann ich die verschiedenen Möglichkeiten ins SQL einbauen oder muss ich da wirklich die verschiedenen Abfragen einzeln zusammensetzen?

Vielen Dank,
lg


----------



## SlaterB (25. Mai 2011)

```
String q = "select p from " + PARTICIPANT + " as p, " + 
	PARTICIPANCE + " as pa, " + EVENT + " as e " +
    " where p = pa.participant and pa.event = e";
if (xy) {
   q +=   " and e.eventname = ?" ;
}
if (xy2) {
  q +=   " and e.eventtime = ?";
}
```
usw., später beim Parameter setzen genauso ifs,
kann man mit Aufwand eigener Hintergrundklassen verkürzen, z.B. zu


```
Query q = new Query("select p from " + PARTICIPANT + " as p, " + 
	PARTICIPANCE + " as pa, " + EVENT + " as e " +
    " where p = pa.participant and pa.event = e");

if (xy) {
   q.addWherePart(" and e.eventname = ?", eventNameString);
}
if (xy2) {
  q.addWherePart(" and e.eventname = ?", eventTimeDate);
}
```
nur noch ein if, Werte werden intern gespeichert um am Ende auf automatische Weise passend zugeordnet,

noch schöner vielleicht

```
Query q = new Query("select p from " + PARTICIPANT + " as p, " + 
	PARTICIPANCE + " as pa, " + EVENT + " as e " +
    " where p = pa.participant and pa.event = e");
q.addWherePartIfNotEmpty(" and e.eventname = ?", eventNameString);
q.addWherePartIfNotEmpty(" and e.eventname = ?", eventTimeDate);
```
mit interner Prüfung ob Parameter null oder leer ist

-----

falls du fragst ob es vergleichbares fertig gibt: ich denke nicht, jedenfalls nicht in der API,
das ist alles viel zu spezifisch je nach eigenen Vorstellungen,
vielleicht irgendwo im Internet, aber da kann ich persönlich auch nichts konkretes nennen


----------



## Gast2 (25. Mai 2011)

Läuft das auf einer Oracle? Dann kann man da auch mit anderen Tricks rangehn und den Oracle Optimizer das erledigen lassen:

Ask Tom "Making a genric search sql Query"


----------



## Generic1 (26. Mai 2011)

Hallo nochmal,

also nur das ich sicher gehe, die Klasse Query muss ich mir selber schreiben mit der Methode addWherePartIfNotEmpty -> so eine Klasse hab ich nicht gefunden.
Die Values (die Werte für die ?) muss ich dann z.B. bei einem StringBuilder in meiner Klasse einfach hinten anhängen. hättest du das so gemeint?
Vielen Dank,
lg


```
Query q = new Query("select p from " + PARTICIPANT + " as p, " + 
    PARTICIPANCE + " as pa, " + EVENT + " as e " +
    " where p = pa.participant and pa.event = e");
q.addWherePartIfNotEmpty(" and e.eventname = ?", eventNameString);
q.addWherePartIfNotEmpty(" and e.eventname = ?", eventTimeDate);
```


----------



## SlaterB (26. Mai 2011)

meine Idee war Marke Selberbauen, ja

direkt anhängen ist eine Möglichkeit, dann ist das ? wohl nicht nötig,
hat die bekannten Nachteile wie Formatierung, Anführungszeichen, SQL-Injection,

schöner wäre bei den bekannten sauberen Mechanismen zu bleiben, ob JDBC PreparedStatement oder Hibernate-Query auch mit Parametern oder was auch immer,
und die Werte so zu merken dass sie am Ende richtig eingefügt werden, 

bei Hibernate kenne ich nichtmal ? sondern benannte Parameter: [c]" and e.eventname = :evName " [/c],
das macht die Zuordnung leichter als alle ? in Reihenfolge merken zu müssen, aber möglich ist vielel

ist sicherlich ein Riesenberg Arbeit, der fraglich zu bewältigen ist wenn du schon solche Nachfragen stellst, 
aber so ist das Leben, sofern niemand fertiges liefert 

lohnt sich wohl nur für zig Queries und freie Zeit, nicht wenn du 5x paar ifs vermeiden willst,
ich selber habe das seit Jahren auf dem Plan und manche Vorstufen, im Grunde aber auch noch nicht


----------

