2016-07-18 36 views
1

Ich möchte Spalte von Basis in Hibernate löschen, wo mein eingefügter -regBroj-Parameter der gleiche wie einer in einer Basis ist.Formulardatenbank kann nicht gelöscht werden SQLGrammarException

Dies ist meine Methode in der Steuerung für deleting.But i SQLGrammarException ständig erhalten: Verursacht durch: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'BG026CH' in 'where clause'

Dieser "BG026CH" ist der Wert von regBroj, den ich als Parameter verwende, um ein Fahrzeug in der Datenbank zu finden und zu löschen. Und ich füge es in den Textbereich in adminPage ein.

public String izbrisi(String regBroj) { 
    List<Vozilo> lista = listaj(); 
     Session s = HibernateUtil.getSessionFactory().getCurrentSession(); 
     Transaction t = s.beginTransaction(); 

     for (int i = 0; i < lista.size(); i++) { 
      if (regBroj .equals(lista.get(i).getRegBroj())) { 
       String izbrisiquery = "DELETE FROM Korisnik WHERE brojLk=" + regBroj + ""; 
       Query q = s.createQuery(izbrisiquery); 
       int a = q.executeUpdate(); 
       t.commit(); 
       return "adminPage"; 
      } 
     } 
     t.commit(); 
     return "error"; 


    } 
+0

Die Antwort von @Dhaval unten sollte Ihr unmittelbares Problem beheben, aber Sie sollten _seriously_ in Erwägung ziehen, vorbereitete Anweisungen zu verwenden, um SQL-Injection zu vermeiden. –

Antwort

2

ersetzen Bitte unten Zeichenfolge mit diesen einem

String izbrisiquery = "DELETE FROM Korisnik WHERE brojLk='" + regBroj + "'"; 
+0

Großartig es funktioniert, ich habe vergessen hinzuzufügen - '' - in meiner Abfrage. – Stanimir

2

Sie sollten mit Prepared Statements betrachten, weil sie mit Anführungszeichen Feldwert zu entkommen automatisch Pflege nehmen, und sie werden Sie auch von SQL-Injection schützen.

// obtain a Connection object using your Hibernate session, or through some other means 
Connection conn = getDBConnection(); 

for (int i = 0; i < lista.size(); i++) { 
    if (regBroj .equals(lista.get(i).getRegBroj())) { 
     String izbrisiquery = "DELETE FROM Korisnik WHERE brojLk = ?"; 
     PreparedStatement ps = conn.prepareStatement(izbrisiquery); 
     ps.setString(1, regBroj); 
     ps.executeUpdate(); 
     t.commit(); 

     return "adminPage"; 
    } 
} 

zu sehen, wie SQL-Injection funktioniert, oder wie ein böswilliger Benutzer die Korisnik Tabelle Wrack konnte sich vorstellen, dass jemand die UI-Hacks einen Wert von '' OR TRUE für brojLK passieren. Dies ist, was die resultierende DELETE Aussage aussehen würde:

DELETE FROM Korisnik WHERE brojLk = '' OR TRUE 

Mit anderen Worten, diese Abfrage injiziert würde Ihre gesamte Tabelle löschen! Vorbereitete Anweisungen würden bei dieser Eingabe ersticken, und ein Hacker würde nicht so weit kommen, die Abfrage auszuführen.

+0

Das könnte eine dumme Frage sein. Wissen Sie einige gute Tutorials auf vorbereiteten Anweisung – Stanimir

+0

Starten Sie mit [MKYong] (http://www.mkyong.com/jdbc/jdbc-preparestatement-example-select-list-of-the- records /), der normalerweise Dinge gut erklären kann. –

+0

@Stanimir Abgesehen davon sind vorbereitete Anweisungen besser geeignet, um sie zwischenzuspeichern. –