2010-11-10 6 views
6

ich versuche zu tun:Problem Positionsparameter in JPA nativen Abfrage

String sql = "SELECT email FROM users WHERE (type like 'B') AND (username like '?1')"; 
List results = em.createNativeQuery(sql).setParameter(1, username).getResultList(); 

Aber ich Illegal bekommen, das mir sagt, dass der Parameter außerhalb der Grenzen ist. Was mache ich falsch?

Antwort

7

Es sollte keine Anführungszeichen um die Parameter geben. Versuchen Sie stattdessen:

String sql = "SELECT email FROM users WHERE (type like 'B') AND (username like ?1)"; 

Sie könnten auch nochmals überprüfen möchten, dass Sie wirklich type like 'B' bedeuten, da dies wahrscheinlich nicht das tut, was Sie denken, es tut.

+0

Ich denke, dass sie 1-basiert sind (im Gegensatz zur Logik) – Bozho

+1

@Bozho: Sicher? * Im Gegensatz zu JDBC nummeriert Hibernate Parameter von Null. * Http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/objectstate.html#objectstate-querying-executing –

+0

Ah, richtig. Ich habe immer benannte Parameter verwendet, so dass dies mir entgangen ist :) – Bozho

2

a) Warum würden Sie Native SQL für eine einfache Abfrage wie diese verwenden? Verwenden Sie JPQL.
b) Warum verwenden wie, wenn Sie keine Platzhalter verwenden? Verwenden Sie stattdessen =.

String jpql = 
    "SELECT u.email FROM users u WHERE (u.type = 'B') AND (u.username = '?1')"; 

List results = 
    em.createQuery(jpql) 
     .setParameter(1, username) 
     .getResultList(); 
+2

Ich habe keine Objektrepräsentation für die Benutzer, deshalb, weil es sich um eine einfache Abfrage handelt, habe ich Native gewählt. Ich habe eigentlich eine große DB mit vielen Entitäten, alles schön gemacht mit JPA, aber ich habe diese externe DB, die ich für 2-3 Abfragen verwende (wie diese), also entschied ich mich, es einfach mit nativen Abfragen zu halten. –

+0

Ok, das hört sich vernünftig an –