Ok, efter masser af eksperimenter med forskellige strategier, her er hvad jeg gjorde, der endelig virkede.
Jeg så dette indlæg her
og pludselig huskede JPA Tuple
Interface, som er et objekt, der kan returnere flere resultattype(r). Så for at udføre mit like
sammenligning, og da Dato ikke bare kan castes til en streng, er her trinene;
- Jeg får kolonnen som en
Tuple
- tjek The Tuple Object for at se, om det kan tildeles fra Dato
- hvis det er, så hent Dato-Format-udtrykket og send det til
like
udtryk.
Så i det væsentlige, her er hvad jeg oprindeligt havde, som tilsyneladende fejlede;
predicates.add(cb.like(cb.lower(entity.get("dateJoined").as(String.class)), "%"+search.toLowerCase()+"%"));
Nu er det her, jeg har, der fungerer smukt;
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()+"%"));
}
BEMÆRKSE-VÆRDIGE OVERVEJELSER -
- Jeg er klar over, at uanset hvor søgningen vil blive påbegyndt, er alle mine datoer præsenteret i denne form
07/10/2015 10:25:09 PM
deraf min evne til at vide, hvordan man formaterer datoen for sammenligningen i minlike
udtryk som"'%d/%m/%Y %r'"
. - Dette er kun et trin, der fungerer for Dates. De fleste andre typer, f.eks. int, long, char ... osv... kan alle castes direkte til streng, og efterhånden som jeg udforsker flere typer data, vil jeg helt sikkert gøre det samme for enhver anden type, der ikke kan castes direkte til streng .
Selvom dette fungerer perfekt for mig, men før jeg markerer dette som det rigtige svar, vil jeg udsætte det for nogle mere omfattende tests og i processen holde det åbent for kommentarer fra alle, der har nogen forbehold over for min strategi.
Og til sidst, til den ene person, at dette hjalp på nogen måde... Skål!