Érvényesítse az IN kifejezés szintaxist egy gyűjtemény értékű bemeneti paraméterrel

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: