sql >> Databasteknik >  >> RDS >> Mysql

Hur man söker efter datumfält för en sträng med JPA Criteria API

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;

  1. Jag får kolumnen som en Tuple
  2. kontrollera The Tuple Object för att se om det går att tilldela från Date
  3. 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 -

  1. 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 min like uttryck som "'%d/%m/%Y %r'" .
  2. 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!



  1. Lagra taggar i databasen. Lagra taggen en eller flera gånger?

  2. mysql GROUP_CONCAT dubbletter

  3. Välj från samma tabell som en infoga eller uppdatering

  4. Hur hanterar jag att öppna/stänga Db-anslutning i en Go-app?