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 Date
de 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-DD
y el problema que estoy enfrentando es la if
declaració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?
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 em
se refiere a un EntityManager objeto entonces se puede construir una Criteria
consulta 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 (
String
yDate
). - 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 <= c
no es una sentencia Java válido. Es necesario que seaa <= b && b <= c
).
Aquí es una manera de comparar el uso de la Date
clase (nota que desde Java 8 LocalDate
es 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 EntityManager
lugar de escribir SQL nativo entonces que en realidad es un buen consejo. Que necesita para construir su consulta mediante la Criteria
abstracción. ¿Cómo hacer eso es probablemente una cuestión aparte.