Az IN kifejezések Java Persistence API (JPA) előírása
meghatározza, hogy egy gyűjtemény értékű bemeneti paramétert nem vesznek
körül zárójelek. Az OpenJPA engedélyezi a zárójelek jelenlétét, míg az EclipseLink
kivételt dob, amikor a Query.setParameter módszert egy
gyűjtemény objektummal hívja meg, amely megfelel egy zárójelekben lévő
gyűjtemény értékű IN bemeneti paraméternek.
Ez a szabály észleli a Java Persistence
Query Language (JPQL) utasításokat tartalmazó karaktersorozatokat,
amelyekben egyetlen paraméter zárójelben van egy IN
kifejezésben.
Mivel a lekérdezési karaktersorozat és a megfelelő
setParameter hívás lehet különböző osztályokban, a szabály
nem garantálja, hogy a paraméter egy gyűjtemény.
Ha a paraméter gyűjteménytípus, távolítsa el a zárójeleket a lekérdezési
karaktersorozatból.
Vegye figyelembe, hogy a zárójelek literálok vagy egyértékű bemeneti
paraméterek esetén érvényesek, tehát legyen óvatos azzal kapcsolatban,
hogy mit távolít el.
A probléma megoldásához távolítsa el a zárójeleket a gyűjtemény értékű
bemeneti paraméterrel rendelkező IN kifejezésből.
Például az OpenJPA engedélyezi a zárójeleket a következő lekérdezési
karaktersorozatokban, azonban az EclipseLink kivételt dob a
setParameter meghívásakor, és megpróbálja beállítani az
ids paramétert egy olyan értékre, ami egy gyűjtemény.
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);
|
A probléma javítása érdekében távolítsa el a zárójeleket, amikor az
ids egy gyűjteményt ábrázol.
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);
|
A következőkben egy olyan példa látható, ami meg van jelölve, de nem
szabad módosítani, mert az id egy egyértékű paraméter.
String idMatch = getIdToQuery();
Query query = em.createQuery(SELECT p FROM Person p WHERE p.id IN (:id));
query.setParameter("id", idMatch);
|
A problémával és más OpenJPA - EclipseLink költöztetési problémákkal kapcsolatban tekintse meg a következőket: