2011-06-08 14 views
20

So che posso passare un elenco alla query denominata in JPA, ma per quanto riguarda NamedNativeQuery? Ho provato molti modi, ma non riesco ancora a passare l'elenco a NamedNativeQuery. Qualcuno sa come passare una lista alla clausola in in NamedNativeQuery? Grazie mille!JPA che passa l'elenco alla clausola IN nella query nativa con nome

Il NamedNativeQuery è la seguente:

@NamedNativeQuery(
    name="User.findByUserIdList", 
    query="select u.user_id, u.dob, u.name, u.sex, u.address from user u "+ 
     "where u.user_id in (?userIdList)" 
) 

e si chiama in questo modo:

List<Object[]> userList = em.createNamedQuery("User.findByUserIdList").setParameter("userIdList", list).getResultList(); 

Tuttavia il risultato non è come mi aspettavo.

System.out.println(userList.size()); //output 1 

Object[] user = userList.get(0); 
System.out.println(user.length); //expected 5 but result is 3 
System.out.println(user[0]);  //output MDAVERSION which is not a user_id 
System.out.println(user[1]);  //output 5 
System.out.println(user[2]);  //output 7 
+0

Hai provato eseguendo esattamente la stessa query utilizzando il client di DB? –

risposta

14

Un elenco non è un parametro valido per una query SQL nativa, poiché non può essere associato a JDBC. Devi avere un parametro per ogni argomento nella lista.

dove u.user_id a (? Id1,? ID2)

Questo è supportata tramite JPQL, ma non SQL, così si potrebbe usare JPQL al posto di una query nativa.

Alcuni provider JPA possono supportare questo, quindi è possibile che si voglia registrare un errore nel proprio provider.

+3

Come è la domanda ... – SoftwareSavant

1

Provato in JPA2 con Hibernate come provider e sembra che hibernate supporti l'inserimento di un elenco per "IN" e funzioni. (Almeno per le query denominate e credo che sarà simile con le query NATIVE denominate) L'ibernazione internamente genera parametri dinamici, all'interno della stessa come il numero di elementi nell'elenco passato.

Così in te nell'esempio precedente

List<Object[]> userList = em.createNamedQuery("User.findByUserIdList").setParameter("userIdList", list).getResultList(); 

Se la lista ha 2 elementi della query sarà simile

select u.user_id, u.dob, u.name, u.sex, u.address from user u "+ 
     "where u.user_id in (?, ?) 

e se ha 3 elementi sembra che

select u.user_id, u.dob, u.name, u.sex, u.address from user u "+ 
     "where u.user_id in (?, ?, ?) 
-1

È può provare questo : userIdList anziché (? UserIdList)

@NamedNativeQuery(
     name="User.findByUserIdList", 
     query="select u.user_id, u.dob, u.name, u.sex, u.address from user u "+ 
      "where u.user_id in :userIdList" 
) 
0

A seconda del database/fornitore/driver/etc., Si può, infatti, passare un elenco come un parametro legato a una query nativo JPA.

Ad esempio, con Postgres ed EclipseLink, il seguente funziona (restituisce true), dimostrando matrici multidimensionali e come ottenere un array di doppia precisione. (Do SELECT pg_type.* FROM pg_catalog.pg_type per altri tipi;. Probabilmente quelli con _, ma spoglia prima dell'uso)

Array test = entityManager.unwrap(Connection.class).createArrayOf("float8", new Double[][] { { 1.0, 2.5 }, { 4.1, 5.0 } }); 
Object result = entityManager.createNativeQuery("SELECT ARRAY[[CAST(1.0 as double precision), 2.5],[4.1, 5.0]] = ?").setParameter(1, test).getSingleResult(); 

Il cast c'è quindi l'array letterale è di doppie piuttosto che numerico.

Più al punto della domanda - Non so come o se è possibile fare query con nome; Penso che dipenda, forse. Ma penso che seguire avrebbe funzionato per la roba di Array.

Array list = entityManager.unwrap(Connection.class).createArrayOf("int8", arrayOfUserIds); 
List<Object[]> userList = entityManager.createNativeQuery("select u.* from user u "+ 
    "where u.user_id = ANY(?)") 
    .setParameter(1, list) 
    .getResultList(); 

non ho lo stesso schema OP, quindi non ho controllato esattamente questo, ma penso che dovrebbe funzionare - ancora una volta, almeno su Postgres & EclipseLink.

Inoltre, la chiave è stata trovata in: http://tonaconsulting.com/postgres-and-multi-dimensions-arrays-in-jdbc/

Problemi correlati