Ok, po wielu eksperymentach z różnymi strategiami, oto co zrobiłem, co w końcu zadziałało.
Widziałem ten post tutaj
i nagle przypomniałem sobie Tuple
JPA
Interfejs będący obiektem, który może zwrócić wiele typów wyników. Aby wykonać moje like
porównanie, a ponieważ Data nie może być po prostu rzutowana na String, oto kroki;
- Otrzymuję kolumnę jako
Tuple
- sprawdź obiekt krotki, aby zobaczyć, czy można go przypisać od daty
- jeśli tak, pobierz wyrażenie Date-Format i przekaż je do
like
wyrażenie.
Zasadniczo oto, co początkowo miałem, a które najwyraźniej zawiodło;
predicates.add(cb.like(cb.lower(entity.get("dateJoined").as(String.class)), "%"+search.toLowerCase()+"%"));
Teraz to, co mam, działa pięknie;
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()+"%"));
}
WZGLĘDY WARTE UWAGI -
- Zdaję sobie sprawę, że z miejsca, w którym rozpoczęłoby się wyszukiwanie, wszystkie moje daty są prezentowane w tym formularzu
07/10/2015 10:25:09 PM
stąd moja umiejętność sformatowania daty do porównania w moimlike
wyrażenie jako"'%d/%m/%Y %r'"
. - To tylko jeden krok, który działa w przypadku Daty. Większość innych typów, np. int, long, char ...itd... może być bezpośrednio Cast to String, a gdy będę odkrywać więcej typów danych, na pewno zrobię to samo dla każdego innego Type, który nie może być bezpośrednio Cast to String .
Chociaż to działa idealnie dla mnie, ale zanim oznaczę to jako właściwą odpowiedź, poddam to bardziej obszernym testom, a przy tym pozostanę otwarty na komentarze wszystkich, którzy mają jakiekolwiek zastrzeżenia do mojej strategii.
I wreszcie, dla tej jednej osoby, której to w jakikolwiek sposób pomogło... Na zdrowie!