Die JPA-Spezifikation (Java Persistence API) für IN-Ausdrücke definiert, dass ein Eingabeparameter mit einem Sammlungswert nicht in runde Klammern eingeschlossen werden darf. In OpenJPA sind die Klammern zulässig. EclipseLink jedoch löst eine Ausnahme aus, wenn Sie
die Methode Query.setParameter mit einem Sammlungsobjekt aufrufen, das einem IN-Eingabeparameter mit einem Sammlungswert in runden Klammern entspricht.
Diese Regel erkennt Zeichenfolgen, die JPQL-Anweisungen mit IN-Ausdrücken mit einem einzigen in Klammern eingeschlossenen Parameter enthält.
Da sich die Abfragezeichenfolgen und der entsprechende setParameter-Aufruf in verschiedenen Klassen befinden können, kann die Regel nicht garantieren, dass der Parameter eine Sammlung ist.
Entfernen Sie die Klammern aus der Abfragezeichenfolge, wenn der Parameter den Typ Sammlung hat.
Gehen Sie beim Entfernen vorsichtig vor, da Klammern für Literale und Eingabeparameter mit einem einzigen Wert gültig sind.
Dieses Problem wird durch das Entfernen der Klammern aus einem IN-Ausdruck mit einem Eingabeparameter mit einem Sammlungswert behoben.
In den folgenden Abfragezeichenfolgen lässt OpenJPA beispielsweise die Klammern zu. EclipseLink hingegen löst eine Ausnahme aus, wenn Sie setParameter aufrufen und versuchen, ids auf einen Wert zu setzen, der eine Sammlung ist.
List<String> idList = getIdsToQuery();
Query query = em.createQuery("SELECT p FROM Person p WHERE p.id IN (:ids)");
query.setParameter("ids", idList);
final String ENTITY_NAME = "Person";
final String PRIMARY_KEY = "id";
List<String> idList2 = getIdsToQuery();
Query query = em.createQuery("SELECT p FROM " + ENTITY_NAME + " p " +" WHERE p." + PRIMARY_KEY + " IN (:ids)");
query.setParameter("ids", idList2);
|
Um dieses Problem zu beheben, entfernen Sie die runden Klammern, wenn ids für eine Sammlung steht.
List<String> idList = getIdsToQuery();
Query query = em.createQuery("SELECT p FROM Person p WHERE p.id IN :ids");
query.setParameter("ids", idList);
final String ENTITY_NAME = "Person";
final String PRIMARY_KEY = "id";
List<String> idList2 = getIdsToQuery();
Query query = em.createQuery("SELECT p FROM " + ENTITY_NAME + " p " +" WHERE p." + PRIMARY_KEY + " IN :ids");
query.setParameter("ids", idList2);
|
Im Folgenden sehen Sie ein Beispiel, das zwar markiert wird, aber nicht geändert werden sollte, da id ein Parameter mit einem einzigen Wert ist.
String idMatch = getIdToQuery();
Query query = em.createQuery(SELECT p FROM Person p WHERE p.id IN (:id));
query.setParameter("id", idMatch);
|
Informationen zu diesem Problem und zu weiteren Problemen bei der Migration von OpenJPA auf EclipseLink finden Sie in den folgenden Quellen: