Ok, efter mycket experimenterande med olika strategier, här är vad jag gjorde som äntligen fungerade.
Jag såg det här inlägget här
och plötsligt mindes JPA Tuple
Gränssnitt som är ett objekt som kan returnera flera resultattyper. Så för att utföra min like
jämförelse, och eftersom Date inte helt enkelt kan kastas till en sträng här är stegen;
- Jag får kolumnen som en
Tuple
- kontrollera The Tuple Object för att se om det går att tilldela från Date
- om det är det, hämta datumformatuttrycket och skicka det till
like
uttryck.
Så i huvudsak, här är vad jag hade från början som tydligen misslyckades;
predicates.add(cb.like(cb.lower(entity.get("dateJoined").as(String.class)), "%"+search.toLowerCase()+"%"));
Nu, det här är vad jag har som fungerar vackert;
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()+"%"));
}
OBSERVERA ATT OBS -
- Jag är medveten om att varhelst sökningen skulle påbörjas, presenteras alla mina datum i detta formulär
07/10/2015 10:25:09 PM
därav min förmåga att veta hur man formaterar datumet för jämförelsen i minlike
uttryck som"'%d/%m/%Y %r'"
. - Detta är bara ett steg som fungerar för Dates. De flesta andra typer, t.ex. int, long, char ...etc... kan alla castas direkt till sträng och när jag utforskar fler typer av data kommer jag definitivt att göra detsamma för alla andra typer som inte kan castas direkt till sträng .
Även om det här fungerar perfekt för mig, men innan jag markerar det här som rätt svar, kommer jag att utsätta det för några mer omfattande tester och i processen hålla det öppet för kommentarer från alla som har några reservationer mot min strategi.
Och till sist, till den där personen som detta hjälpte på något sätt... Skål!