Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So durchsuchen Sie das Datumsfeld nach einer Zeichenfolge mithilfe der JPA Criteria API

Ok, nach vielem Experimentieren mit verschiedenen Strategien habe ich Folgendes getan, das endlich funktioniert hat.

Ich habe diesen Beitrag gesehen hier und erinnerte sich plötzlich an das JPA Tuple Schnittstelle, die ein Objekt ist, das mehrere Ergebnistypen zurückgeben kann. Also um mein like auszuführen Vergleich, und da Date nicht einfach in einen String umgewandelt werden kann, sind hier die Schritte;

  1. Ich bekomme die Spalte als Tuple
  2. überprüfen Sie das Tuple-Objekt, um zu sehen, ob es von Date zuweisbar ist
  3. Wenn ja, dann hole den Date-Format-Ausdruck und übergebe ihn an like Ausdruck.

Also im Wesentlichen, hier ist, was ich ursprünglich hatte, was anscheinend fehlschlug;

predicates.add(cb.like(cb.lower(entity.get("dateJoined").as(String.class)), "%"+search.toLowerCase()+"%")); 

Nun, das ist, was ich habe, das wunderbar funktioniert;

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()+"%"));
}

BEMERKENSWERTE ÜBERLEGUNGEN -

  1. Mir ist bekannt, dass von wo auch immer die Suche gestartet wird, alle meine Daten in dieser Form 07/10/2015 10:25:09 PM angezeigt werden daher meine Fähigkeit zu wissen, wie man das Datum für den Vergleich in meinem like formatiert Ausdruck als "'%d/%m/%Y %r'" .
  2. Dies ist nur ein Schritt, der für Dates funktioniert. Die meisten anderen Typen, z. B. int, long, char ... etc ... können alle direkt in String umgewandelt werden, und wenn ich mehr Datentypen untersuche, werde ich definitiv dasselbe für jeden anderen Typ tun, der nicht direkt in String umgewandelt werden kann .

Obwohl dies für mich perfekt funktioniert, aber bevor ich dies als die richtige Antwort markiere, werde ich es einigen ausführlicheren Tests unterziehen und es dabei für Kommentare von allen offen halten, die irgendwelche Vorbehalte gegen meine Strategie haben. P>

Und zu guter Letzt an diese eine Person, der das in irgendeiner Weise geholfen hat... Prost!