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 ;
- J'obtiens la colonne sous la forme d'un
Tuple
- faire une vérification sur l'objet Tuple pour voir s'il est assignable à partir de la date
- 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 -
- 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 monlike
expression sous la forme"'%d/%m/%Y %r'"
. - 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 !