EJB QL: Wie ist die "where" Klausen dynamisch veränderbar?

Hi,

ich benutzte den JDeveloper 10g. Bei meiner Anwendung werden die Daten mittels EJB geholt.

Jetzt werden in der Hauptseite die Mitgliedsnummer, Name, Vorname, Zugehörigtkeit, bezahlte Beiträge, usw. aufgelistet. Diese Ausgabe wird in einer finder -Methode vordefiniert die dann vom Session Bean aufgerufen wird.

Code:
SELECT Object(o) FROM Mitglieder o WHERE o.spiele=?1

Nun möchte ich aber die WHERE Klauses dynamsich erzeugen.

z.B. so:
Ich habe auf der HTML Seite einige Felder zum selektieren. Alle selektieren Felder sollen in die WHERE Klausel eingebunden werden.

Ist kein Feld selektiert so sollte es so aussehen:
Code:
SELECT Object(o) FROM Mitglieder o

Sind 10 Felder selektiert dann so:
Code:
SELECT Object(o) FROM Mitglieder o WHERE o.spiele=?1 AND o.name=?2 AND o.nachname=?3 AND o.strasse=?4 AND o.stadt=?5 AND o.plz=?6 AND o.mitgliedSeit=?7 AND o.offenerBetrag=?8 AND o.mitgliedsNr=?9 AND o.info=?10

Sind nur 3 Felder selektiert dann halt so:
Code:
SELECT Object(o) FROM Mitglieder o WHERE o.spiele=?1 AND o.name=?2 AND o.nachname=?3

Gibt es hierfür eine spezielle Methode die ich verwenden muss oder kennt jemand da eine Möglichkeit?

Vorab danke für die Hilfe.

Gruß
 
Zuletzt bearbeitet:
Meines Wissens gibt es keine Möglichkeit die "Finder-Methoden" zur Laufzeit zu verändern.

Ich hatte es versucht, eine EJB QL Funktion aufzurufen, der ich den SQL String als Übergabeparameter mitgebe.

Leider Erfolglos.

Über Lösungsvorschläge würde ich mich natürlich auch sehr freuen...

gruss
 
Hallo!

IMHO kann man die EJB-QL Statements nicht dynamisch ändern... du musst schon entsprechende finder-Methoden für das jeweilige Home Interface generieren lassen.
Das ist übrigens eines der vielen Schwachpunkte von EJB... eventuell mag es dazu herstellerspezifische Lösungen geben, jedoch ist's dann kein Standard EJB mehr..
Als alternative bleibt immernoch pures JDBC (Etwa in Form einer BMP-EntityBean)
...oder ein entsprechender OR-Mapper wie Hibernate. (Meiner Meinung nach sollte man solche Lösungen (OR-Mapper) EJB CMP/BMP (<=2.x) vorziehen.
Na ja, warten wir mal ab, wie sich EJB 3.0 so in der Praxis bewährt...

Gruss Tom
 
Moin,

Eine Variante wäre es, mit LIKE zu arbeiten. Du definierst einen Select über die gesamte Tabelle und je nachdem ob du einen Wert hast oder nicht, setzt du den Wert oder '%' ein. Wenn du Null in den Spalten erlaubst, solltest du für jede Spalte noch eine IS NULL Abfrage einbauen, da '%' nicht auf Null-Werte geht (iirc).

Auf alle Fälle solltest du bei extensiver Verwendung von LIKE prüfen, ob dir die Performance deiner Anwendung noch ausreicht! LIKE ist nicht gerade die schnellste Art einer Datenbankabfrage (vor allem wenn es 10 mal in einem select vorkommt ;) ).

Gruß
THMD
 
Hallo!

Das bedeutet doch (IMHO), dass man eine art "super-finder" Methode braucht, die als Parameter alle moeglichen Abfrageparameter aufnimmt...

Code:
    SomeBusinessObject findByBusinessKeyABusinessKeyBBusinessKeyC(String businessKeyA,String businessKeyB,String businessKeyC)
   	throws FinderException;
   
  SomeBusinessObject findByBusinessKeyABusinessKeyBBusinessKeyC(String businessKeyA,String businessKeyB,String businessKeyC)
 	throws FinderException;
 
 SELECT OBJECT(o) FROM businesObject o WHERE ((o.businessKeyA LIKE %?1%) OR (o.businessKeyB LIKE %?2%) OR (o.businessKeyC LIKE %?3%))
...
fuer Felder nach denen du nicht suchen lassen willst uebergibst du dann einfach (?) null
als entsprechendes Argument.

Ich weis nicht, ob dass so toll ist... vielleicht sollte man fuer hochdynamsiche Queries doch besser JDBC verwenden. (Wie gesagt ich empfehle generell bei sowas den Einsatz von Hibernate oder Spring JDBC)

Gruss Tom
 
Moin,
Thomas Darimont hat gesagt.:
Das bedeutet doch (IMHO), dass man eine art "super-finder" Methode braucht, die als Parameter alle moeglichen Abfrageparameter aufnimmt...
Ja das ist so korrekt.
Thomas Darimont hat gesagt.:
Ich weis nicht, ob dass so toll ist... vielleicht sollte man fuer hochdynamsiche Queries doch besser JDBC verwenden. (Wie gesagt ich empfehle generell bei sowas den Einsatz von Hibernate oder Spring JDBC)
Nein es ist überhaupt nicht toll. Es kann durch die massive Verwendung von LIKE auf Datenbankseite (je nach DBMS und Feintuning) sogar ziemlich imperformant sein. Je nach "Größe" der Datenbasis würd ich bei dem Problem auf JDBC (vor allem bei ReadOnly-Daten) oder Hibernate zurückgreifen. SpringJDBC kenn ich nur vom Namen, da kann ich jetzt keine Aussage dazu treffen.
 
Thomas Darimont hat gesagt.:
Hallo!

Das bedeutet doch (IMHO), dass man eine art "super-finder" Methode braucht, die als Parameter alle moeglichen Abfrageparameter aufnimmt...

Code:
    SomeBusinessObject findByBusinessKeyABusinessKeyBBusinessKeyC(String businessKeyA,String businessKeyB,String businessKeyC)
   	throws FinderException;
   
  SomeBusinessObject findByBusinessKeyABusinessKeyBBusinessKeyC(String businessKeyA,String businessKeyB,String businessKeyC)
 	throws FinderException;
 
 SELECT OBJECT(o) FROM businesObject o WHERE ((o.businessKeyA LIKE %?1%) OR (o.businessKeyB LIKE %?2%) OR (o.businessKeyC LIKE %?3%))
...
fuer Felder nach denen du nicht suchen lassen willst uebergibst du dann einfach (?) null
als entsprechendes Argument.

Ich weis nicht, ob dass so toll ist... vielleicht sollte man fuer hochdynamsiche Queries doch besser JDBC verwenden. (Wie gesagt ich empfehle generell bei sowas den Einsatz von Hibernate oder Spring JDBC)

Gruss Tom

Das habe ich schon versucht. Und in der Tat das ist nichts gewesen. In der neuen Version soll diese Funktion vorhanden sein. Bin gespannt.

Trotzdem danke Jungs ;)

Gruß
 

Neue Beiträge

Zurück