Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment rechercher un champ de date pour une chaîne à l'aide de l'API JPA Criteria

Ok, après de nombreuses expériences avec diverses stratégies, voici ce que j'ai fait qui a finalement fonctionné.

J'ai vu ce message ici et soudainement rappelé le JPA Tuple Interface qui est un objet pouvant renvoyer plusieurs types de résultats. Alors pour effectuer mon like comparaison, et puisque Date ne peut pas être simplement casté en une chaîne, voici les étapes ;

  1. J'obtiens la colonne sous la forme d'un Tuple
  2. faire une vérification sur l'objet Tuple pour voir s'il est assignable à partir de la date
  3. si c'est le cas, récupérez l'expression Date-Format et transmettez-la à like expression.

Donc, essentiellement, voici ce que j'avais au départ qui échouait apparemment ;

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

Maintenant, c'est ce que j'ai qui fonctionne à merveille ;

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()+"%"));
}

CONSIDÉRATIONS À NOTER -

  1. Je suis conscient que d'où que la recherche soit lancée, toutes mes dates sont présentées sous cette forme 07/10/2015 10:25:09 PM d'où ma capacité à savoir comment formater la Date pour la comparaison dans mon like expression sous la forme "'%d/%m/%Y %r'" .
  2. Il ne s'agit que d'une étape qui fonctionne pour les dates. La plupart des autres types, par exemple int, long, char ... etc ... peuvent tous être directement convertis en chaîne et à mesure que j'explore davantage de types de données, je ferai certainement de même pour tout autre type qui ne peut pas être directement converti en chaîne. .

Bien que cela fonctionne parfaitement pour moi, mais avant de marquer cela comme la bonne réponse, je vais le soumettre à des tests plus approfondis et, dans le processus, le garder ouvert aux commentaires de toute personne ayant des réserves sur ma stratégie.

Et enfin, à cette personne à qui cela a aidé de quelque manière que ce soit... Bravo !