Cómo comprobar la validez de Java Tipo de fecha?

Daredevil:

Escribí dos funciones simples para obtener el valor de mi cita en la tabla de MySQL. Ambas columnas de fecha de inicio y fecha de finalización son tanto Datede tipo de datos. Por lo tanto, en mi estos dos función que va más o menos así:

public Date get_startdate(long nodeid,String ts) {
    try {
        String sql="Select STARTDT FROM urllink WHERE URL='f0="+nodeid+"&ts="+ts + "'";
        if (em == null) {
             throw new Exception("could not found URL object.");
        }
        return (Date) em.createNativeQuery(sql).getSingleResult();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public Date get_enddate(long nodeid,String ts) {
    try {
        String sql="Select ENDDT FROM urllink WHERE URL='f0="+nodeid+"&ts="+ts + "'";
        if (em == null) {
            throw new Exception("could not found URL object.");
        }
        return (Date) em.createNativeQuery(sql).getSingleResult();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

Ahora que yo llamo estas funciones en mi página principal como estos, quiero comprobar las condiciones de fecha que si la URL es entre estas dos fechas, entonces debería ser válido y hacer algo. Resalto lo que quiero decir a continuación:

Date file_getstartdate=fileFacade1.get_startdate(fileID,hash);
Date file_getenddate=fileFacade1.get_enddate(fileID,hash);

String currentDate = CoreUtil.parseDate(new Date());

if( file_getstartdate<= currentDate<= file_getendDate){
    //URL is valid, do something
}else {
    //do nothing
}

Mi fecha almacenada en mi mesa está en el formato YYYY-MM-DDy el problema que estoy enfrentando es la ifdeclaración de arriba para hacer el comparison.I no puede utilizar los operadores que hacer la revisión. ¿Hay una manera de lograr lo que deseo?

Jugador uno :

No utilice concatenación de cadenas para construir consultas SQL

Esta es vulnerable a la inyección de SQL, y es muy peligroso:

String sql="Select STARTDT FROM urllink WHERE URL='f0="+nodeid+"&ts="+ts + "'";
...
return (Date) em.createNativeQuery(sql).getSingleResult();

Suponiendo que emse refiere a un EntityManager objeto entonces se puede construir una Criteriaconsulta basada, o si realmente necesario seguir con SQL nativo, entonces debería usar un PreparedStatement lugar.

Para su comparación pregunta, tiene tres temas:

  • Usted está tratando de comparar dos tipos diferentes ( Stringy Date).
  • Usted está tratando de utilizar un operador que sólo puede ser utilizado para comparar las primitivas pero no objetos ( <=).
  • Usted está escribiendo su condición como un enunciado matemático en lugar de una sentencia condicional programación ( a <= b <= cno es una sentencia Java válido. Es necesario que sea a <= b && b <= c).

Aquí es una manera de comparar el uso de la Dateclase (nota que desde Java 8 LocalDatees una clase mejor tanto para usar si usted tiene la opción).

Date fileStartDate = fileFacade1.get_startdate(fileID, hash);
Date fileEndDate = fileFacade1.get_enddate(fileID, hash);

Date currentDate = new Date();

if (fileStartDate.before(currentDate) && fileEndDate.after(currentDate) {
  ...

En respuesta a tu comentario

Bien, pero no el uso de PreparedStatement ayuda con este inejction SQL. Qué gestor de la entidad a prevenir la inyección? Me dijeron que no usar PreparedStatement, ¿hay otras alternativas?

Si alguien le dijo que hiciera una consulta mediante la concatenación de cadenas nativo (los +nodeid+y +ts +las partes de su código) en lugar de utilizar un PreparedStatement entonces están equivocados. Un EntityManager no le protegerá de la inyección en el código anterior, pero un PreparedStatement, junto con el cambio de cómo se construye la consulta, lo haría.

Un PreparedStatement sería algo como

String url = "f0=" + nodeid + "&ts=" + ts;
PreparedStatement preparedStatement = connection.prepareStatement("Select STARTDT FROM urllink WHERE URL= ?");
preparedStatement.setString(1, url);
ResultSet resultSet = preparedStatement.executeQuery();

Si le han dicho a utilizar un EntityManagerlugar de escribir SQL nativo entonces que en realidad es un buen consejo. Que necesita para construir su consulta mediante la Criteriaabstracción. ¿Cómo hacer eso es probablemente una cuestión aparte.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=118746&siteId=1
Recomendado
Clasificación