JPQL mit WHERE und LIKE funktioniert "manchmal"?

chrisbad

Mitglied
Hi Forum,

ich baue gerade an einer WebApp unter Glassfish 3.1.1 mit JSF 2.0, Primefaces 3.0.1 und Eclipselink 2.3. In dieser App habe ich viele Seiten mit dataTables die lazy geladen werden.
Die dataTables werden live gefiltert wofür ich mit JPQL eine entsprechende Query der Form

Java:
SELECT a FROM User a WHERE a.username LIKE :username  AND a.company LIKE :company ...

zusammenbaue.

Das Problem ist nun dass es, egal wie ich es mache (QueryString bauen, Parameter benutzen, CriteriaBuilder), manchmal funktioniert und manchmal nicht.

Sprich ich habe einen Benutzernamen "Christian" und beim Eintippen wird sobald eine Taste losgelassen wird die Query ausgeführt. Also fange ich an zu tippen und bei

C gehts
Ch gehts
Chr gehts nicht
Chri geht
usw.
Chris geht
Christ geht
Christi geht nicht

Wann es geht und wann nicht ist unterschiedlich.
Wenn ich die Daten komplett lade und in der Liste filtere funktioniert es einwandfrei.
Hat jemand eine Idee in welche Richtung ich hier suchen sollte? Kann es sein, dass einfach zuviele Queries abgefeuert werden?

LG Chris
 
S

SlaterB

Gast
betrachte doch nicht so komische Gebilde aus mehreren Ebenen,
worüber hast du alles die Kontrolle, was passiert als BlackBox im Hintergrund?

Schritt 1, komplett unabhängig von der DB, ist das Eintippen irgendwo und die Generierung von Events daraus,
kannst du irgendwo loggen welche Tasten zu welchen Ereignissen führen, sind damit Web-Request verbunden, kommen die alle an usw.?
aus der DB müssen die gar nicht beantwortet werden, wie du selber schreibst 'Wenn ich die Daten komplett lade und in der Liste filtere funktioniert es einwandfrei.' kann man auch anders vorhehen,
bezog sich dein Satz auf das Textfeld und das Autocomplete dahinter, funktioniert das auf diese Weise?

sofern du das Geschehen kontrollierst kannst du wie gesagt auch komplett ohne DB auskommen und nur eine statische Liste von Strings durchsuchen

---------

Schritt 2, deutlich getrennt davon ist die Ausführung der DB-Queries,
aus Schritt 1 kommen vielleicht Aufrufe getAll("Chr");, diese Methode könnte nun auf DB umgestellt, Queries ausgeführt werden,
logge exakt, welche Query irgendwo an zentraler Stelle ankommt mit wechen Ergebnissen,
es kann doch kaum sein dass eine Query was falsches zurückgibt, wenn komplett verständlich durchleuchtet,
oder falls es doch so scheint:
passiert das reproduzierbar? versuche es an anderer Stelle ohne das Textfeld, stelle die problematische Query für sich,
bzw. führe alle Queries in Reihenfolge hintereinander aus,
besteht dort, ganz ohne direkte Textfeld-Verknüpfung, dasselbe Problem?
 

chrisbad

Mitglied
Ja, womöglich hast du recht.

Zu 1:

da ich Primefaces nutze habe ich auf dessen dataTables keinen besonderen Einfluss. Aber ja, wenn ich die Daten ungefiltert komplett lade und dann selbst filtere funktioniert es einwandfrei. Insofern liegt es nicht an Primefaces oder den Events oder ähnlichem. Wenn es irgendwie geht würde ich aber gerne nur die Daten laden die ich auch brauche, da ich ja sonst wieder ziemlich viel Speicher verbrauche.

Zu 2:

Im Prinzip habe ich das so gemacht. Nur leider ohne Erfolg. Ich versuche das noch mal exemplarisch darzustellen:

SELECT a FROM User a WHERE a.username LIKE '%filter%'
^^^^^^^^^^^^^^^^^^^^^

Filter habe ich dynamisch durch den eingegebenen Wert ersetzt.
Der gekennzeichnete Abschnitt wurde dynamisch erzeugt und mit "AND" mit zusätzlichen Filter-Feldern ergänzt falls nötig.

Also entweder ich hab einen Fehler in der Query-Syntax oder ich feuere zu viele Queries zu schnell ab. Im Moment ist es so, dass bei jedem Loslassen einer Taste eine Query ausgeführt wird.

Ich werde das Loggen der Queries noch mal testen. Gibt es eigentlich einen JPQL-Editor in Eclipse?
 
Zuletzt bearbeitet von einem Moderator:

Ähnliche Java Themen


Oben