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
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.