Dobře, po spoustě experimentování s různými strategiemi jsem udělal toto, co nakonec fungovalo.
Viděl jsem tento příspěvek zde
a najednou si vzpomněl na JPA Tuple
Rozhraní, což je objekt, který může vrátit více typů výsledků. Abych provedl můj like
porovnání, a protože Datum nelze jednoduše přetypovat na řetězec, zde jsou kroky;
- Dostanu sloupec jako
Tuple
- zkontrolujte objekt Tuple, abyste zjistili, zda je přiřaditelný z Date
- pokud ano, získejte výraz Date-Format a předejte jej
like
výraz.
Takže v podstatě zde je to, co jsem původně měl, což zjevně selhalo;
predicates.add(cb.like(cb.lower(entity.get("dateJoined").as(String.class)), "%"+search.toLowerCase()+"%"));
Teď mám tohle, co krásně funguje;
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()+"%"));
}
POZNÁMKY HODNÉ -
- Jsem si vědom toho, že kdekoli by bylo vyhledávání zahájeno, všechna moje data jsou uvedena v tomto tvaru
07/10/2015 10:25:09 PM
odtud moje schopnost vědět, jak formátovat Datum pro porovnání v mémlike
výraz jako"'%d/%m/%Y %r'"
. - Toto je jen jeden krok, který pro Dates funguje. Většinu ostatních typů, např. int, long, char ...atd... lze všechny přenést přímo do řetězce a jak prozkoumávám další typy dat, určitě udělám totéž pro jakýkoli jiný typ, který nelze přímo přenést do řetězce .
I když to pro mě funguje perfektně, ale než to označím za správnou odpověď, podrobím to rozsáhlejším testům a nechám to otevřené pro komentáře každého, kdo má nějaké výhrady k mé strategii.
A nakonec jedné osobě, které to jakkoli pomohlo... Na zdraví!