JPQL - Join Verkettung

Mr_Burns

Mitglied
Hallo Zusammen!

Ich bin noch ziemlich neu was JPQL angeht. Wahrscheinlich ist es ein trivialer Fehler. Aber ich finde keine Lösung. Würde mich freuen wenn mir jemand weiterhelfen kann.

Ich habe folgende Abfrage erstellt. Diese liefert aber leider keine Ergebnisse. Warum?
Code:
SELECT DISTINCT e FROM Customer AS e
JOIN e.personOfContacts e_personOfContacts
JOIN e_personOfContacts.posContacts posContacts
WHERE (e.customerName LIKE :term OR posContacts.contactValue LIKE : term)

Lasse ich die OR Bedingung weg und frage nur nach contactValue erhalte ich Ergebniss
Code:
SELECT DISTINCT e FROM Customer AS e
JOIN e.personOfContacts e_personOfContacts
JOIN e_personOfContacts.posContacts posContacts
WHERE posContacts.contactValue LIKE : term

Lasse ich die OR Bedingung weg und frage wiederum nur der customerName ist die Ergebnisliste wieder leer:
Code:
SELECT DISTINCT e FROM Customer AS e
JOIN e.personOfContacts e_personOfContacts
JOIN e_personOfContacts.posContacts posContacts
WHERE customerName LIKE : term

Meine Entities:
Java:
@MappedSupperclass
public abstract class AbstractBaseEntity implements Serializable {

    @Id
    String uuid;
    
    ....
}

@Entity
public class Customer extends AbstractBaseEntity {

    String customerName;

    @OneToMany(mappedBy="customer", cascade=CascadeType.ALL, orphanRemoval=true)
    private List<PersonOfContact> personOfContacts;

    ....
}

@Entity
public class PersonOfContact extends AbstractBaseEntity {

    @OneToMany(mappedBy="personOfContact", cascade=CascadeType.ALL, orphanRemoval=true)
    private List<PosContact> posContacts;

    ....
}

@Entity
public class PosContact extends AbstractBaseEntity {

    String contactValue;

    ....
}

Bin für jeden Hinweis dankbar.
Grüsse
 
Zuletzt bearbeitet von einem Moderator:
M

maki

Gast
Du willst bestimmt kein LIKE auf eine ID.
Die sollte doch entweder exakt stimmen, oder nicht ;)
 

Mr_Burns

Mitglied
Du willst bestimmt kein LIKE auf eine ID.
Die sollte doch entweder exakt stimmen, oder nicht ;)

@maki
Stimmt, das LIKE auf der customerId ist natürlich quatsch. Ich habe beim kürzen des Quelltexts und posten die erste Eigenschaft der Klasse Customer genommen ohne darauf zu achten. Habe meine Anfrage entsprechend geändert (von customerId nach customerName).

Siehst Du evtl. den Fehler in der Abfrage?

Grüsse
 
S

SlaterB

Gast
einen Fehler könnte man in begrenzter Informationsbeschaffung sehen,
wie läuft denn mit einer normale Query ohne Joins
Code:
SELECT DISTINCT e FROM Customer AS e
WHERE customerName LIKE : term
?

wie sieht es ohne Like aus, mit normalen =, gehen mehrere normale =-Bedingungen mit OR verknüpft?,
macht LIKE bei anderen Feldern Probleme? oder klappt dort alles, auch OR?
welche Werte sind beteiligt, hat es was mit null zu tun,
kommt ganz ohne WHERE-Einschränkung genügend heraus?
 
Zuletzt bearbeitet von einem Moderator:
M

maki

Gast
Ich hätte gesagt, das LIKE auf eine ID schon falsch ist, da wird zB. mit id LIKE %12_ nicht viel gefunden werden können...
 

Mr_Burns

Mitglied
@SlaterB
@maki
Zunächst möchte ich einmal Danke sagen für die schnellen Antworten.

Normale Abfrage ohne Join geht:
Code:
SELECT DISTINCT e FROM Customer AS e
WHERE e.customerName LIKE :term

Auch mehrere OR bringt die zu erwartenden Ergebnisse:
Code:
SELECT DISTINCT e FROM Customer AS e
WHERE e.customerName LIKE :term OR e.customerNick LIKE :term OR e.customerAlias LIKE :term";

Allerdings könnte NULL ein Hinweis sein. Ich prüfe das gerade. Kann aber etwas dauern, da ich wie gesagt neu in der Materie bin.
 
Zuletzt bearbeitet:

Mr_Burns

Mitglied
Folgendes konnte ich bis jetzt herausfinden:

Angenommen ich habe zwei Kunden:
  • Maier (mit contactValue Eintrag)
  • Maler (ohne contactValue Eintrag)

Wenn ich jetzt nach
Code:
Ma
suchen lasse spuckt er mir NUR Maier aus. Ich würde aber gerne haben, dass er Maier + Maler ausgibt (also alle Einträge die Ma enthalten egal ob ein contactValue Eintrag vorhanden oder nicht). Nur wie mache ich das???
 

Mr_Burns

Mitglied
Lösung:
Code:
SELECT DISTINCT e FROM Customer AS e
JOIN e.personOfContacts e_personOfContacts
LEFT JOIN e_personOfContacts.posContacts posContacts
WHERE (e.customerName LIKE :term OR posContacts.contactValue LIKE : term)

Man beachte das
Code:
LEFT
. Auf diese Weise werden Maier und Maler (aus obigem Beispiel) ausgeworfen.

Nochmals Danke an SlaterB und maki. Konstruktive Hilfe. Tolles Forum das Ihr hier betreibt.
 
S

SlaterB

Gast
LEFT JOIN - SQL
ist grundsätzlich das Mittel dazu,
im Detail für mich aber immer wieder kompliziert, hast du da eigentlich SQL oder eine andere Abfragesprache (in Hibernate gibts HQL)?

ich glaube du musst auf (x is null or x like ..) abfragen, neben der grundsätzlich richtig eingebauten Left Join-Verknüpfung natürlich,
am besten erstmal ohne WHERE auf übersichtlichen Dummy-Tabellen/ Entities üben

edit: na das ging dann ja leicht, umso besser
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D JPQL- Query über mehrere Tabellen Datenbankprogrammierung 7
R JPQL und Navigation durch Collection Datenbankprogrammierung 1
M Hibernate JPQL SELECT optional? Datenbankprogrammierung 2
A Jpql - order by sum ??? Datenbankprogrammierung 13
Y JPQL WHERE != Objekt Datenbankprogrammierung 10
T JPQL Query für eine Tabellenansicht Datenbankprogrammierung 2
S Alle Kunden mit ihren Adressen mit JPQL ausgeben Datenbankprogrammierung 2
G JPQL L*KE / JPA Query Language Datenbankprogrammierung 9
D JOIN COLUMN wird nicht genommen Datenbankprogrammierung 2
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
D Left Join mit Wioth Rollup Datenbankprogrammierung 0
S MySQL ehemaliger FULL OUTER JOIN zusammenstellen Datenbankprogrammierung 1
L Join zweier Tabellen in SQL Datenbankprogrammierung 2
A Fehlermeldung: JOIN FETCH expressions cannot be defined with an identification variable Datenbankprogrammierung 0
B Inner Join ohne SQL Syntax Datenbankprogrammierung 2
S SQL join - NullPointerExeption Datenbankprogrammierung 3
E Mehrere Tabellenspalten mit INNER JOIN verknüpfen Datenbankprogrammierung 1
OnDemand LEFT JOIN id hat Null Datenbankprogrammierung 6
ruutaiokwu reihenfolge der operanden bei join's Datenbankprogrammierung 5
G SQLite Self Join "unbestimmter tiefe" Datenbankprogrammierung 7
I MySQL Vergleich über mehrere Tabellen! Join? Datenbankprogrammierung 6
N Select mit join Datenbankprogrammierung 3
F Oracle select sum() join select sum() Datenbankprogrammierung 9
Kenan89 Datenbank Join Datenbankprogrammierung 16
K SQL Inner Join - On Klausel Datenbankprogrammierung 10
F Komplexer Tabellen-Join und Ausgabe in Excel Datenbankprogrammierung 17
G JOIN Abfrage über mehrere Tabellen Datenbankprogrammierung 15
kirchrath Hibernate Join - angejointes Objekt wählen Datenbankprogrammierung 2
Eldorado MySQL SELECT mit GROUP BY und INNER JOIN Datenbankprogrammierung 2
G Join Abfrage Datenbankprogrammierung 12
S SQL inner join bei >10 Tabellen über 2 Variablen Datenbankprogrammierung 2
T MySQL: Join auf sich selbst schlägt fehlt Datenbankprogrammierung 3
MQue Join n:m Datenbankprogrammierung 9
0x7F800000 MS-SQL Server 2008 Wie benutzt man da NATURAL JOIN / INNER JOIN USING? Datenbankprogrammierung 3
D join updaten in java Datenbankprogrammierung 4
G [Hibernate] Problem mit LEFT JOIN Datenbankprogrammierung 7
S Preparestatement mit join Datenbankprogrammierung 4
S MySQL: Abfrage auf 2 Tabellen durch join Datenbankprogrammierung 5
P Join Datenbankprogrammierung 4
G Hilfe: Werte sind alle x2 (oder mehr) nach JOIN Datenbankprogrammierung 13
M Proble mit Selcet mit join und rst.next() Datenbankprogrammierung 15
T Diverse JDBC Probleme (inner join, rs.last(), update) Datenbankprogrammierung 2
E ERROR: argument of JOIN/ON must be type boolean? Datenbankprogrammierung 2
E Nochmal eine Datenbankabfrage Frage :-o (JOIN oder so) Datenbankprogrammierung 4
E JOIN und * Datenbankprogrammierung 3
G Probleme mit Access und Join Datenbankprogrammierung 3
G PL/SQL: Join mit Collection Datenbankprogrammierung 5
T [SQL] Doppelter Join aus der selben Tabelle & Feldnnamen Datenbankprogrammierung 3
S JOIN und wohin damit? Datenbankprogrammierung 5
S Verkettung von Spalteninhalten aus mehreren Zeilen Datenbankprogrammierung 10

Ähnliche Java Themen


Oben