2012-10-09 108 views
1

我試圖找到這個錯誤:錯誤在SQL語句中

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您在您的SQL語法錯誤 ;檢查對應於您 MySQL服務器版本在1號線

它在哪裏使用近「%ORDER BY t1.nombre_cuenta ASC」正確的語法手冊?非常感謝:

public Tdatoscuentas[] consultarCuentas(int id_tipo_cuenta){ //Acabar método para login 

    Tdatoscuentas[] params = null; 

    try { 
     this.conexion=conectar(); 
     System.out.println("Vamos a usar el id tipo cuenta:"+id_tipo_cuenta); 
     int id_tipo_cuenta_padre=id_tipo_cuenta-1; 
     //System.out.println(); 

     SQL="SELECT t1.id_cuenta as id_cuenta,"+  
       "t1.n_cuenta as n_cuenta,"+ 
      "SUBSTRING_INDEX(t1.n_cuenta,'.',"+id_tipo_cuenta_padre+") as n_cuenta_padre,"+ 
      "t1.nombre_cuenta as nombre,"+   
      "(SELECT tt1.cif"+ 
      " FROM cuentas_rs tt1"+ 
      " WHERE tt1.id_cuenta = t1.id_cuenta"+ 
      " ORDER BY tt1.f_inicio DESC "+ 
      " LIMIT 1) as cif,"+       
      "(SELECT tt2.porcentaje "+ 
      " FROM impuestos tt2"+ 
      " WHERE tt2.id_pais = (SELECT tt1.cif"+ 
      "      FROM cuentas_rs tt1"+ 
      "      WHERE tt1.id_cuenta = t1.id_cuenta"+ 
      "      ORDER BY tt1.f_inicio DESC"+ 
      "      LIMIT 1)"+ 
      " ORDER BY tt2.f_inicio DESC "+ 
      "LIMIT 1) as impuesto,"+ 
      "t1.descuento as descuento,"+  
      "t1.id_tipo_cuenta as nivel,"+   
      "t1.borrado as borrado,"+   
      "t1.cod_cliente as cod_cliente "+  
      "FROM cuentas t1 "+ 
      "LEFT OUTER JOIN cuentas_rs t2 ON t2.id_cuenta = t1.id_cuenta"+ 
      " WHERE t1.id_esquema_asociado = 1"+ 
      " AND t1.id_proveedor_cloud = 1"+ 
      " AND SUBSTRING(t1.n_cuenta,1,LENGTH(001.00001))"+ 
      " AND t1.id_tipo_cuenta =("+id_tipo_cuenta+")"+ 
      " AND t1.borrado = false"+   
      " AND t1.nombre_cuenta LIKE %" +   
      " ORDER BY t1.nombre_cuenta ASC"; 

     System.out.println("La consulta de SQL para consultar Cuentas es:"+SQL); 
     this.pstm  = this.conexion.prepareStatement(SQL); 

     this.rs = pstm.executeQuery(); 

     this.rs.last(); 
     int numRows = this.rs.getRow(); 
     this.rs.beforeFirst(); 
     System.out.println("Vamos a hacer:"+numRows); 
     params = new Tdatoscuentas[numRows]; 

     int i=0; 
     while(this.rs.next()){ 
      params[i] = new Tdatoscuentas(); 
       params[i].setId_cuenta(this.rs.getInt("id_cuenta")); 
       params[i].setN_cuenta(this.rs.getString("n_cuenta")); 
       params[i].setN_cuenta_padre(this.rs.getString("n_cuenta_padre")); 
       params[i].setNombre_cuenta(this.rs.getString("nombre")); 
       params[i].setCif(this.rs.getString("cif")); 
       params[i].setImpuesto(this.rs.getDouble("impuesto")); 
       params[i].setDescuento(this.rs.getDouble("descuento")); 
       params[i].setNivel(this.rs.getInt("nivel")); 
       params[i].setBorrado(this.rs.getBoolean("borrado")); 
       params[i].setCod_cliente(this.rs.getString("cod_cliente")); 

      i++;   

      } 
     System.out.println("params tiene una long de"+params.length); 
     return params; 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return params; 

} 

回答

0

看看上pattern matching的文檔。

變化

「AND t1.nombre_cuenta LIKE%」 +

「AND t1.nombre_cuenta LIKE '%'」 +

我也第二次@ podiluska的建議,研究在y中使用綁定變量我們的疑問。

+1

這條線會有什麼意義? – eggyal

+0

我同意 - 因爲它會匹配任何東西,所以在該行上沒有任何意義。至少它是有效的SQL。 – alfredaday

3

它在我還建議在preparestatement是如何設計工作讀了行" AND t1.nombre_cuenta LIKE %" +

你釋放這到野外了。

+0

你怎麼把它放在裏面,用LIKE'%'? – zoit

+0

@zolt:這將修復語法錯誤,但它會匹配所有字符串(所以包含這樣的過濾條件有什麼意義?)。 – eggyal

1

正是在這裏:

... 
AND t1.nombre_cuenta LIKE %" + <---------- It is here  
      " ORDER BY t1.nombre_cuenta ASC 
... 

您必須添加字符串%後匹配,它必須被引用類似:Like '%somevalue'

+0

您還需要引用模式字符串。 – eggyal

+0

@eggyal好了現在就修好了 –

0

首先您%應該是這樣的 '%'

" AND t1.nombre_cuenta LIKE '%'" + 
+1

這條線會是什麼意思? – eggyal

+0

@eggyal沒有,但我不是在爲他查詢,只是指出錯誤... –