JPA's MapKEY, VALUE Abfrage nach JPQL ist fehlgeschlagen

7

Ich speichere eine Map in JPA, die eine Keyword-Übersetzung in jeder Sprache speichert. Wie ein Objekt speichert Locale.ENGLISH -> "Father" , Locale.CHINESE -> "PaPa" . Und ein anderes Objekt speichert Locale.ENGLISH -> "Mother" , Locale.CHINESE -> "MaMa" ;

Hier ist mein Arbeitsentwurf:

%Vor%

Es funktioniert gut, ich kann viele Schlüsselwortübersetzungen in DB speichern. Aber wenn Sie mit JPQL abfragen, hat es einige Probleme:

Ich möchte zum Beispiel herausfinden, welche Relation einen englischen Schlüssel mit dem Wert "Vater" hat:

Das ist mein Code:

%Vor%

Es erzeugt dieses seltsame / nicht funktionierende SQL:

%Vor%

Ich weiß nicht, warum es diese seltsame Unterabfrage erzeugt.

Ich kann dieses Problem anhand von Kriterien lösen:

%Vor%

Es erzeugt korrektes SQL ( where langmap1_.locale=? and langmap1_.value=? ) und funktioniert gut.

Aber ich finde, Kriterien sind zu kompliziert. Und ich frage mich, warum der JPQL gescheitert ist? Wie korrigiert man den JPQL?

Danke.

Env:

JPA2, Hibernate 4.2.3, MySQL-Dialekt

    
smallufo 21.01.2014, 16:27
quelle

3 Antworten

11

Ich hatte ein ähnliches Problem mit dem JPQL VALUE () Operator mit Hibernate. Es scheint, dass Hibernate den VALUE () - Operator wie die Methode java.util.Map.values ​​() in Java implementiert. Es generiert eine Unterabfrage, die alle Werte in der Zuordnung zurückgibt, d. H. Alle Zeilen der Zuordnungstabelle, die sich auf die Entität beziehen, die das Attribut Map enthält. Sobald Sie mehr als ein Schlüssel / Wert-Paar in der Map haben, wird ein Vergleichsausdruck, der Skalarausdrücke als Operanden erwartet, fehlschlagen.

Sie können den Vergleichsausdruck umdrehen und in einen IN-Ausdruck konvertieren.

Anstelle von:

%Vor%

Sie können schreiben:

%Vor%

Ich hoffe, dass Ihre Anfrage so funktioniert.

    
MSC 30.05.2014 19:06
quelle
10

Ich hatte das gleiche Problem. Es sieht so aus, als ob der Zugriff auf map by ref (ohne VALUE ()) bereits einen Map-Eintragswert ergibt, d. H. Der nächste JPQL sollte in ein gültiges SQL umgewandelt werden:

%Vor%     
flipp5b 16.06.2015 14:41
quelle
0

Der korrekte JPQL könnte so aussehen:

%Vor%     
Mateusz Rasiński 20.08.2014 13:17
quelle

Tags und Links