2013-12-09 49 views
0

我正在嘗試使用字段條件的可變順序創建mysql選擇查詢。Mysql按可更改字段排序

此查詢正在Java應用程序中運行。

查詢是:

public static final String LECTURAREFADMINPAGFILTRO = "SELECT Agente.idAgente, Agente.nomAgente, Agente.emailAgente, Agente.nomDir, Agente.zonaAgente, Agente.paisAgente, Agente.equipoAgente, Agente.catAgente, Referencia.idReferencia,Referencia.nomMaterial, Referencia.tipoMaterial, Referencia.protocometa, Referencia.precio, Referencia.guidlineUso, Referencia.especialista, Solicitud.IdSolicitud, Solicitud.estSolicitud, AgenteSolicitud.prescriptor, AgenteSolicitud.stockAgente, AgenteSolicitud.stockagenteConf, AgenteSolicitud.undspropSist, AgenteSolicitud.undsconfAgente, AgenteSolicitud.undsEnvio, AgenteSolicitud.idAgenteSolicitud FROM AgenteSolicitud join Solicitud on AgenteSolicitud.Solicitud_idSolicitud=Solicitud.idSolicitud and Solicitud.Agente_idAgente=AgenteSolicitud.Agente_idAgente and Solicitud.Peticion_idPeticion = AgenteSolicitud.Solicitud_Peticion_idPeticion and Solicitud.Peticion_Actividad_idActividad=AgenteSolicitud.Solicitud_Peticion_Actividad_idActividad join Agente on Agente.idAgente=Solicitud.Agente_idAgente join Actividad on Agente.Actividad_idActividad=Actividad.idActividad, Referencia where Referencia.idReferencia=Solicitud.Referencia_idReferencia and Actividad.nomActividad=? and Solicitud.estSolicitud='Activa' ORDER BY ? ASC LIMIT ? OFFSET ?"; 

的?值作爲參數傳遞,按標準排序,作爲參數傳遞的任何字段。

我跑松鼠這個查詢,按字段「?」的順序,一個字段值,並且查詢成功運行。

但是,在Java應用程序中,當我執行相同的查詢時,它不像是按照標準支付訂單。

Java代碼相關的查詢是:

@Override 
public List<String> listaFiltro(String ciclo, String ordenacion, String limit, String offset) { 
CRUD bd = new CRUD(); 
List<String> lista = new ArrayList<String>(); 
String[] valores = new String[4]; 
valores[0]=ciclo; 
valores[1]=ordenacion; 
valores[2]=limit; 
valores[3]=offset; 
try { 
     lista = bd.leer(Constantes.LECTURAREFADMINPAGFILTRO, valores); 
}catch (Exception e) { 
     e.printStackTrace(); 
} 

     return lista; 
} 


public List <String> leer(String cadena, String [] valores) throws SQLException{ 
    log.info("Entra en la función leer(String cadena, String [] valores)"); 
    this.conectar(); 

    List <String> listaDatos = new ArrayList <String>(); 
    try{ 

    PreparedStatement stmt = con.prepareStatement(cadena); 
    System.out.println("Número de filas maximo "+stmt.getMaxRows());   
    if(valores != null){ 
     for(int i=0; i< valores.length;i++){ 
      stmt.setString(i+1,valores[i]); 
     } 
    } 
    ResultSet rs = null; 
    rs = stmt.executeQuery(); 
    ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData(); 
    int numeroColumnas= rsmd.getColumnCount(); 

    while (rs.next()){ 
//   contar_filas++; 
     //Si la columna es solo 1, no hace falta que dividamos las columnas 
     if (numeroColumnas >1){ 
      String fila =""; 
      for (int i=1;i<=numeroColumnas;i++){ 
        fila=fila + "::" + rs.getString(i); 
      } 
      fila=fila+"%%"; 
      listaDatos.add(fila); 
     }else{ 
      listaDatos.add(rs.getString(1)); 
     } 
    } 

    log.info("La lista total se compone de "+listaDatos.size()+ " elementos"); 
    log.info("Los valores leidos son: " + listaDatos.toString()); 
    if (stmt!=null) { 
     stmt.close(); 
    } 
    }catch(Exception e){ 
     log.info("CRUD: Ha ocurrido un error"); 
     log.info("CRUD: el error es " + e.getMessage().toString()); 
     con.close(); 
     e.printStackTrace(); 
    }finally{ 
     this.cerrarConexion(); 
    } 
    log.info("Sale de la función leer(String cadena, String [] valores)"); 

    return listaDatos; 

} 

的「ordenacion」的價值,它實際上是我想要做的順序的字段名。

任何想法我可以錯過什麼?

預先感謝您的寶貴時間,

親切的問候,

+1

什麼是你的Java代碼? – Loc

+0

什麼是Constantes.LECTURAREFADMINPAGFILTRO?我們需要在Java – Loc

回答

2
  1. 不知道可以通過參數?爲了排序。如果你使用。生成的SQL像這樣ORDER BY'abc'。不確定這項工作。

  2. 您可以使用?對於LIMIT和OFFSET,但其數據類型是INT,NOT String,所以你必須使用setInt。

  3. 您可以閱讀功能做這樣的(建立你的SQL)

    字符串SQL =「SELECT your_columns ... WHERE ... AND Actividad.nomActividad =?AND Solicitud.estSolicitud = '的Activa' AND ORDER BY「+ valores [1] +」ASC LIMIT「+ valores [2] +」OFFSET「+ valores [2];

    PreparedStatement stmt = con.prepareStatement(sql);

    stmt.setString(1,valores [0]); //只有1個參數

    ....

+0

DYNAMIC SQL?中看到您的查詢。我會研究它,但你能給我一個鏈接或例子作爲模板來實現這一目標嗎?感謝您的快速響應。我正在接受你的答案:)。 – Catersa