sql >> Base de Datos >  >> RDS >> Mysql

Cómo buscar un campo de fecha para una cadena usando la API de criterios JPA

Ok, después de experimentar mucho con varias estrategias, esto es lo que hice y finalmente funcionó.

Vi esta publicación aquí y de repente recordó el JPA Tuple Interfaz que es un objeto que puede devolver múltiples tipos de resultados. Así que para realizar mi like comparación, y dado que la fecha no se puede convertir simplemente en una cadena, estos son los pasos;

  1. Obtengo la columna como una Tuple
  2. haga una verificación en The Tuple Object para ver si es asignable desde Date
  3. si es así, obtenga la expresión de formato de fecha y pásela a like expresión.

Básicamente, esto es lo que tenía inicialmente y que aparentemente estaba fallando;

predicates.add(cb.like(cb.lower(entity.get("dateJoined").as(String.class)), "%"+search.toLowerCase()+"%")); 

Ahora, esto es lo que tengo que funciona maravillosamente;

Path<Tuple> tuple = entity.<Tuple>get("dateJoined");
if(tuple.getJavaType().isAssignableFrom(Date.class)){
    Expression<String> dateStringExpr = cb.function("DATE_FORMAT", String.class, entity.get("dateJoined"), cb.literal("'%d/%m/%Y %r'"));
    predicates.add(cb.like(cb.lower(dateStringExpr), "%"+search.toLowerCase()+"%"));
}

CONSIDERACIONES IMPORTANTES -

  1. Soy consciente de que desde donde se inicie la búsqueda, todas mis fechas se presentan de esta forma 07/10/2015 10:25:09 PM de ahí mi capacidad para saber cómo formatear la Fecha para la comparación en mi like expresión como "'%d/%m/%Y %r'" .
  2. Este es solo un paso que funciona para las fechas. La mayoría de los otros tipos, por ejemplo, int, long, char, etc., se pueden convertir directamente en cadena y, a medida que exploro más tipos de datos, definitivamente haré lo mismo con cualquier otro tipo que no se pueda convertir directamente en cadena. .

Aunque esto funciona perfectamente para mí, pero antes de marcar esto como la respuesta correcta, lo someteré a algunas pruebas más extensas y en el proceso lo mantendré abierto para comentarios de cualquiera que tenga alguna reserva sobre mi estrategia.

Y finalmente, a esa persona a la que esto ayudó de alguna manera... ¡Salud!