Добре, след много експерименти с различни стратегии, ето какво направих, което най-накрая проработи.
Видях тази публикация тук
и изведнъж си спомни JPA Tuple
Интерфейс, който е обект, който може да връща множество типове резултати. Така че да изпълня моя like
сравнение и тъй като Date не може да бъде просто прехвърлен към низ, ето стъпките;
- Получавам колоната като
Tuple
- направете проверка на обекта Tuple, за да видите дали може да се присвои от дата
- ако е, тогава вземете израза Date-Format и го предайте на
like
израз.
Така че по същество, ето какво имах първоначално, което очевидно се проваляше;
predicates.add(cb.like(cb.lower(entity.get("dateJoined").as(String.class)), "%"+search.toLowerCase()+"%"));
Ето какво имам, което работи прекрасно;
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()+"%"));
}
СЪОБРАЖЕНИЯ, ВЪЗНАЧИТЕЛНИ -
- Знам, че откъдето и да започне търсенето, всичките ми дати са представени в този формуляр
07/10/2015 10:25:09 PM
оттук и способността ми да знам как да форматирам датата за сравнение в мояlike
израз като"'%d/%m/%Y %r'"
. - Това е само една стъпка, която работи за Dates. Повечето други типове, например int, long, char ... и т.н.... всички могат да бъдат директно прехвърляни към низ и докато изследвам повече типове данни, определено ще направя същото за всеки друг тип, който не може да бъде директно прехвърлен към низ .
Въпреки че това работи перфектно за мен, но преди да отбележа това като правилния отговор, ще го подложа на някои по-обстойни тестове и в процеса ще го оставя отворен за коментари от всеки, който има някакви резерви относно моята стратегия.
И накрая, на този човек, че това помогна по някакъв начин... Наздраве!