2016-09-21 4 views
0

Die folgende Methode verwendet die createNativeQuery() Methode des Manager Java Einheit:EntityManager Native Abfragesyntax?

public List<Dog> findDogById(String id) { 

     List<Dog> resultList = new ArrayList<>(); 
     try { 
      resultList = persistence.entityManager().createNativeQuery(" SELECT * FROM DOG WHERE ID = '" + id+ "' ", DogEntity.class).getResultList(); 
     } catch (Exception e) { 
     } 
     return resultList; 
    } 

Das Problem, das ich habe, ist, dass diese Methode nicht welche Ergebnisse ist, wenn ich es erwarten, dies zu tun. I.e. Wenn ich die Abfragen direkt über SQL Developer ausführen bekomme ich Ergebnisse, aber die Methode gibt nicht das gleiche zurück.

Ist meine Syntax korrekt? Ich bin nicht sicher, dazu:

" SELECT * FROM DOG WHERE ID = '" + id+ "' " 

heißt brauche ich sowohl die ' und die "?

Antwort

1

Ihre Syntax korrekt ist, aber sie haben andere Probleme in Ihrem Code.

Sie ignorieren die Ausnahme stillschweigend. Sie sind wahrscheinlich eine Ausnahme, ignorieren sie immer und dann die leere Liste Rückkehr:

try { 
     resultList = persistence.entityManager().createNativeQuery(" SELECT * FROM DOG WHERE ID = '" + id+ "' ", DogEntity.class).getResultList(); 
    } catch (Exception e) { 
     // If an exception is thrown in this try block, you are ignoring it. 
    } 

Wenn Sie die Abfrage ohne Parameterbindung verwenden, könnten Sie Probleme mit SQL-Injection haben. Um ein Beispiel zu geben, wenn jemand 0' OR 1=1-- als die ID in Ihrer Funktion sendet, erhalten Sie eine vollständige Liste der Hunde.

Nutzungsparameter und diese Art von Problemen zu vermeiden, sind die Abfragen auch besser lesbar und weniger fehleranfällig:

.createNativeQuery(" SELECT * FROM DOG WHERE ID = ?1, DogEntity.class) 
.setParameter(1, id) 
.getResultList(); 
+0

Dank ich die e.printStackTrace hinzugefügt haben(), die, dass ein Fehler, wenn ausgelöst hat gezeigt, die Abfrage versucht auszuführen. Dies würde die leeren Listen erklären, die zurückgegeben werden? – java123999

+0

Akzeptierte Antwort, da es half, mein Problem zu lösen. Mein Code warf einen Fehler auf, den ich ignorierte. Der Fehler war, dass mein DB-Aktualisierungsskript nicht ausgeführt wurde, also suchte Hibernate nach einer Spalte, die noch nicht da war. – java123999

0

Um Probleme zu vermeiden, sollten Sie params verwenden:

Query query = em.createNativeQuery("SELECT * FROM DOG WHERE ID = ?"); 
query.setParameter(1, id);