Mysql Order by changeable field

I am trying to create a mysql select query, using a changeable order by field criteria.

This query is being run in a Java app.

The query is :

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 ?";

The ? values are passed as parameters, being the order by criteria, any field passed as parameter.

I have runned this query in squirrel, giving the order by field "?" a field value, and the query runs successfully.

But, in the Java app, when i execute the same query, its like isnt paying atention to the order by criteria.

The Java Code related to the query is :

@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;

}

The "ordenacion" value it is actually the field name by which i want to do the order by.

Any idea what could i be missing?.

Thank you in advance for your time,

Kind regards,

Answers


  1. Not sure you can parameter ? for order by. If you use. The generated SQL like this ORDER BY 'abc'. Not sure this work.

  2. You can use ? for LIMIT and OFFSET but Its datatype is INT, NOT String so you have to use setInt.

  3. You can do like this in leer function (Build your sql)

    String 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]); // ONLY 1 parameter

    ....


Need Your Help

parse unity WWW api response to model

c# parsing unity3d

How do i parse my webapi response into a usefull model?

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.