Konstruktoraufruf dynamisch auswerten und SQL bauen

MaikHSW

Aktives Mitglied
Hey zusammen.
Ich habe folgendes Problem bzw. suche eine Lösung:

Ich habe ein Programm mit AWT-GUI und habe ein Maske in der man per Dropdown diverse Dinge wie Vorname, Nachname, Straße und so weiter auswählen kann.
Dies ist natürlich in einer Klasse realisiert.
Wenn ich dann aus dieser Klasse auf den "Suchen" Button klicke wird anhand der gegebenen Parameter ein Konstruktor von der Klasse "Suchen" aufgerufen.
Problem ist, dass einige vielleicht nur den Vornamen suchen, andere den Nachnamen und so weiter.
Somit werte ich erstmal nur ein Kriterium auf, denn so viele mit Namen "Michael" erwarte ich nicht.
Die Klasse suchen muss also folgendes tun:

Sie bekommt die Parameter im Konstruktor und muss auswerten, ob es sich um einen leeren Parameter handelt (User hat ihn nicht gesetzt) oder nicht. Wenn nicht muss aufgrund dieses Parameters ein SQL-Befehl abgesetzt werden der die Datenbank abfragt.
Und genau da komme ich ins Stocken.
Meine erste Idee war eine sehr lange und eigentlich kranke if-Konstruktion zu wählen und die wahrscheinlichsten Paramter nach oben zu setzen. Das würde in den meisten Fällen nur einen geringen Durchlauf erfordern und daher schnell zum Ziel führen.
Nun habe ich einfach als If-Bedingung folgende genommen:
Java:
if (Name.length()>0)

Dies sorgt aber bei einem leeren String ganz elegant für einen Nullpointer (was ich nicht direkt verstehen kann).
Heißt also zusammegefasst dass es so nicht läuft.
Aber wie mache ich das am besten?

Ich hoffe, es hat irgendjemand verstanden was ich vor habe und kann mir, eine vermutlich sehr triviale, Lösung an die Hand geben.



Gru0
 

XHelp

Top Contributor
Was genau willst du denn wissen?
Wie du den SQL Befehl baust? Wie du den Nullpointer umgehst? Oder etwas anderes?
Wenn du die ganzen Parameter mit SQL abdeckst, dann brauchst du doch gar keine if-Abfragen, denn die DBMS hat für dich schon alles abgefragt (zumindestmal sollte es so sein). Oder machst du eine "WHERE 1=1" Abfrage und wertest alles manuell aus? oO
Spielen denn die Verknüpfungen eine Rolle, oder ist es alles "AND"? Du bekommst eine Liste an Parametern, dann machst du sowas wie:
Java:
public String getWhereClause(List<ParameterObjekt> params) {
  String s = "";
  for (ParameterObjekt currentParameter : params) {
    s+="`"+currentParameter.getName()+"`='"+currentParameter.getValue()+"' AND ";
  }
  if (s.length()>0) {
    s = s.substring(0, s.length() -5);
  }
  return s;
}
 
Zuletzt bearbeitet:

MaikHSW

Aktives Mitglied
Hey XHelp.
Ich brauche eine Lösung für dieses Problem.

Ich baue die SQL-Befehle dann anschließend händisch, bzw. gieße meine Werte nur noch in vorgefertige Befehle ein.
Wenn ich aber ein Gesamt-SQL bauen würde wäre dies tödlich.
Denn ein select * from Tabelle where Name="" and vorname="Hans" wäre unproduktiv wenn ich Hans Meier suche.
Verstehst du?
Ich möchte, wenn der Name gefüllt ist folgendes SQL abschicken:
select * from Tabelle where Name="Meier"

Die Frage ist doch, wie ich am elegantesten auswerte welcher Parameter in der Maske gefüllt wurde und daraus das SQL machen kann.
Das soll dann wieder ein Resultset bauen, welches ich in eine Tabelle parse.

So erfahren bin ich da aber auch nicht, ich übe ja noch aus Spaß.
Wie kann ich alles geschickter machen?


Gruß
 

XHelp

Top Contributor
Also ich habe meinem Post noch etwas hinzugefügt.
Wenn ich aber ein Gesamt-SQL bauen würde wäre dies tödlich.
Denn ein select * from Tabelle where Name="" and vorname="Hans" wäre unproduktiv wenn ich Hans Meier suche.
Wenn du einen Hans Meier suchst, dann ist es der falsche Befehl, denn so wirst du nur namenlose Hansen rausfiltern.
Ich möchte, wenn der Name gefüllt ist folgendes SQL abschicken:
select * from Tabelle where Name="Meier"
Was genau ist jetzt dein Auswahlkriterium? Immer den 1. Parameter raussuchen oder wie? Bzw. warum filterst du nur nach "Meier", wenn der Benutzer auch den Vornamen spezifiziert hat?
Die Frage ist doch, wie ich am elegantesten auswerte welcher Parameter in der Maske gefüllt wurde und daraus das SQL machen kann.
Was genau stellt deine Maske dar, bzw wie gibst du die Daten weiter?
Das soll dann wieder ein Resultset bauen, welches ich in eine Tabelle parse.
hm?

Im grunde brauchst du ja nur alle eingegebenen Parameter mit einem "und" zu verknüpfen und schon hast du deine Klausel.
 

MaikHSW

Aktives Mitglied
Hey XHelp.
Danke für deine Antworten.
Ich glaube, ich drücke mich noch schwierig aus.
Ich mache dir heute Abend mal einen Screenshot der Maske und stell noch was an Erläuterungen ein.
Vielleicht ist auch meine Herangehensweise einfach etwas quer....



Gruß
 

MaikHSW

Aktives Mitglied
Hey.
So, nun habe ich eine mögliche Lösung und zugleich ein neues Problem :)
Also, die Lösung des Übels war eine Prüfung auf null.
Ich habe bisher nur geprüft ob die Länge größer null ist, dies ist aber tödlich wenn man Nullpointer nicht vorbeugt.
Nun frage ich ab auf null (Parameter == null) und somit ist das Problem gelöst.

Folgende Aufgabenstellung ergibt sich aber daraus:
Ich frage aktuell mit einer if- Bedingung ab.
Sprich ich frage ab, ob der Name gefüllt ist.
Sollte dies so sein nutze ich ein SQL und frage entsprechend ab.
Sollte dies nicht so sein prüft er mit einer nächsten If Bedingung ab ob die Stadt gefüllt ist und so weiter.
Heißt aber dass ich eine ganz verschachtelte If-Bedingung habe welche sehr schwer zu durchdringen und erst recht zu warten ist.
Gibt es da elegantere Lösungen?
Ich will möglichst nach Wahrscheinlichkeit gehen, das heißt Name und Stadt z.B. zuerst.
Denn die Hausnummer oder PLZ sucht man vermutlich eher selten.
Und da ich ja möglichst wenig Schleifendurchläufe oder Tiefe suche....
Gibt es da elegante Lösungen?

Danke.



Gruß
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Es existiert keine if-Schleife.
Mir ist immer noch ein Rätsel, was du da überhaupt machst, denn wenn der Benutzer nach Name="Maier" und PLZ="12345", dann musst du ja nur die entsprechende where Klausel bauen "WHERE `Name`='Maier' AND `PLZ`='12345'", und nicht es irgendwie einzeln abfragen.
Deswegen kann ich dir nur das wiederholen, was ich bereits gesagt habe: ja, es gibt eine elegantere Lösung, nämlich where-Klausel bauen.
 

MaikHSW

Aktives Mitglied
Hey XHelp.
Das mit der Schleife habe ich bereits korrigiert, Gedankenfehler meinerseits.
Natürlich sind where Klauseln der Weg.
Aber ich muss ja erstmal heraus finden, welches Feld der User wirklich gefüllt hat.
Nehmen wir mal beispielhaft folgendes an.

In der Maske Quicksearch gibt es 3 Felder: Name, Vorname, Wohnort.

Nun nutzt Mitarbeiter A die Maske da er einen Anruf bekommt, Kunde ist Herr Meier.
Also will er alle Meiers haben.
Vielleicht will er auch bewusst nach Ralf Meier suchen.

Je nachdem was er will fügt er dies aber auch in die Maske ein.
Die denkbaren Konstellationen habe ich nun schon angeführt.
Wenn ich also nun einfach den Inhalt der Felder übergebe und ein SQL mit where Klauseln habe könnte das zu folgendem Resultat führen: select * from Kunde where Name=Ralf and nachname=meier and wohnort=null
Das würde natürlich nichts bringen. Also muss ich qualifizieren, ob ein Wert gefüllt ist und damit ausgewertet werden kann oder nicht. Für dieses Beispiel wäre der richtige Weg ja folgender: select * from Kunde where Name=ralf and nachname=meier;

Verstehst du was ich meine?
Je nach Konstellation kann das aber auch anders ausehen.



Gruß
 

XHelp

Top Contributor
Naja, dann gehst du mit einer Schleife alles durch und prüfst es auf "null" (wobei es mich wundert, warum es null ist und nicht "leerer String", aber egal). Wenn es !=null ist, dann verknüpfst du es mit AND, ansonsten lässt du dieses Parameter weg.
 

MaikHSW

Aktives Mitglied
Hey XHelp.
Eine Schleife?
Ich meine, wir reden hier von 3 Parametern welche entweder null oder gefüllt sein können.
Wie soll man da eine Schleife realisieren? Stehe ich auf dem Schlauch?
Ich würde es fast schon mit if Bedingungen realisieren, das geht bei 3 auch noch.
Aber die erweiterte Suche hat deutlich mehr Bedingungen, das wäre doof....

Danke für deine Hilfe.


Gruß
 

XHelp

Top Contributor
Also wenn es IMMER nur 3 Parameter sind, dann kannst du es so lassen, ansonsten würde deine Taktik überdenken. Du könntest eine Klasse ParameterContainer machen, die name und key hat (so gesehen Map.Entry) und dem Konstruktor einfach eine Liste von ParameterContainer übergeben. Dann kannst du auch elegant mit ner for Schleife alle durchgehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Landei Objekte ohne Konstruktoraufruf erzeugen Allgemeine Java-Themen 7
M Frage zu Konstruktoraufruf Allgemeine Java-Themen 2
berserkerdq2 Jemand einen Tipp wie man ein Javafx-Hintergrund "dynamisch" macht Allgemeine Java-Themen 3
E RMI FWH: RMI- Wie erstelle ich stubs dynamisch, bzw. unterdrücke eine Statisch-Warnung? Allgemeine Java-Themen 0
S Maven Jars dynamisch laden / Plugin-Struktur erstellen Allgemeine Java-Themen 14
T Statisch und dynamisch Allgemeine Java-Themen 1
MiMa Variableninhalte dynamisch abfragen Allgemeine Java-Themen 12
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
S Externe Eclipse Projekte dynamisch einbinden Allgemeine Java-Themen 3
Thallius Externe .jar dynamisch einbinden Allgemeine Java-Themen 5
C Erste Schritte Baumstruktur (dynamisch) Allgemeine Java-Themen 9
F JTree: Nodes dynamisch anlegen via LinkedHashMap Allgemeine Java-Themen 2
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
M Klassen Klasse Dynamisch laden und Konstruktor aufrufen Allgemeine Java-Themen 1
J rxtxserial.dll für 32 oder 64bit dynamisch einbinden Allgemeine Java-Themen 9
F Dynamisch ein Objekt einer bestimmten Subklasse erstellen Allgemeine Java-Themen 7
W Dateinamen dynamisch Parsen Allgemeine Java-Themen 12
T Classpath Klassen dynamisch erstellen Allgemeine Java-Themen 4
F Schlüsselworte Einstellungen dynamisch deserialisieren Allgemeine Java-Themen 5
S LaTeX Code in dynamisch erzeugten PDF's Allgemeine Java-Themen 8
X Dynamisch Konstruktor aufrufen Allgemeine Java-Themen 12
hdi Ressourcen dynamisch zur Laufzeit laden Allgemeine Java-Themen 15
A Klassen dynamisch aus jar-datei laden Allgemeine Java-Themen 5
J instanceof vermeiden und stattdessen dynamisch binden Allgemeine Java-Themen 6
E Variable dynamisch ausgeben Allgemeine Java-Themen 5
Tandibur pattern dynamisch vorkompilieren Allgemeine Java-Themen 9
T Objekt dynamisch neu erstellen/ austauschen Allgemeine Java-Themen 9
T Dynamisch getypte Klasseninstanz? Allgemeine Java-Themen 6
H getText(); bei dynamisch generierten JTextFiled Allgemeine Java-Themen 2
F Wie erfahre ich dynamisch den namen eines aktuellen Objektes Allgemeine Java-Themen 2
S Asymmetrisches Array dynamisch erzeugen Allgemeine Java-Themen 4
T Objekte dynamisch über eine Methode erzeugen Allgemeine Java-Themen 10
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
P RTF dynamisch machen (IText, Swing) Allgemeine Java-Themen 4
B Listener dynamisch setzen Allgemeine Java-Themen 6
P Klasse Dynamisch laden und zurückgeben Allgemeine Java-Themen 17
P Array Dynamisch vergrößern Allgemeine Java-Themen 7
B objekt einer klasse dynamisch erzeugen Allgemeine Java-Themen 6
G Objekt dynamisch erstellen und Inhalte kopieren Allgemeine Java-Themen 6
C Dynamisch Objekte unterschiedlicher Typen erzeugen Allgemeine Java-Themen 6
D Klassen dynamisch laden Allgemeine Java-Themen 5
E Arrays -> dynamisch Allgemeine Java-Themen 21
K Methoden dynamisch erstellen Allgemeine Java-Themen 12
P Dynamisch casten - möglich? wie? Allgemeine Java-Themen 5
T Klassen dynamisch ausführen Allgemeine Java-Themen 3
N Graphische Oberfläche dynamisch erweitern möglich? Allgemeine Java-Themen 4
B Absolute Paf einer Klasse in dieser dynamisch auslesen? Allgemeine Java-Themen 5
K Klasse dynamisch casten Allgemeine Java-Themen 14
Reeny Dynamisch Klassen kompilieren Allgemeine Java-Themen 5
G JDO Dynamisch ? Allgemeine Java-Themen 2
H Objekte m. versch. Interf. dynamisch erzeugen Allgemeine Java-Themen 11
E Klasse dynamisch über main-Methode aufrufen Allgemeine Java-Themen 9
D Strings dynamisch füllen Allgemeine Java-Themen 5
A Dynamisch Attribute hinzufügen Allgemeine Java-Themen 3
N Statistische Auswertung von Logfiles (Einlesen, auswerten und grafische Aufbereitung von logfiles) mit Java Allgemeine Java-Themen 9
M Selenium JUnit Tests (Auswahl von Testmethoden auswerten) Allgemeine Java-Themen 5
L SWT Mathematische Formel mit SWT Textfield auswerten? Allgemeine Java-Themen 3
A interaktives PDF auslesen/auswerten? Allgemeine Java-Themen 0
Z Auswerten eines eingegeben Termes Allgemeine Java-Themen 13
M XML auswerten Allgemeine Java-Themen 1
N Method-Annotations in aufgerufener Methode auswerten Allgemeine Java-Themen 2
R CSV-Datei (korrupt?) auswerten Allgemeine Java-Themen 9
W Annotations selbst erstellen und auswerten Allgemeine Java-Themen 4
H Dokumente auswerten Allgemeine Java-Themen 6
I Große Datei am effektivsten/performantesten auslesen und auswerten? Allgemeine Java-Themen 6
A Wie eine Seriennummer erzeugen und auswerten? Allgemeine Java-Themen 11
G Große XML-Dateien einlesen und auswerten . Allgemeine Java-Themen 2
M Date Range auswerten und die Monate berechnen Allgemeine Java-Themen 2
D Befehlszeilenparameter auswerten Allgemeine Java-Themen 3
P command line parameter auswerten Allgemeine Java-Themen 3
K Einen String als Bedingung auswerten Allgemeine Java-Themen 7
S Logfile auswerten Allgemeine Java-Themen 2
I Fragen zum Internetseiten Einlesen/Auswerten Allgemeine Java-Themen 5
P Audiofile/Audiostream auswerten Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben