2012-10-09 107 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没有,但我不是在为他查询,只是指出错误... –