Mysql
 sql >> Database >  >> RDS >> Mysql

Come cercare nel campo della data una stringa utilizzando l'API dei criteri JPA

Ok, dopo molti esperimenti con varie strategie, ecco cosa ho fatto che alla fine ha funzionato.

Ho visto questo post qui e improvvisamente ha ricordato la JPA Tuple Interfaccia che è un oggetto che può restituire più tipi di risultati. Quindi per eseguire il mio like confronto, e poiché Date non può essere semplicemente convertito in una stringa, ecco i passaggi;

  1. Ottengo la colonna come Tuple
  2. esegui un controllo su The Tuple Object per vedere se è assegnabile da Date
  3. se lo è, prendi l'espressione Date-Format e passala a like espressione.

Quindi, in sostanza, ecco cosa avevo inizialmente che apparentemente stava fallendo;

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

Ora, questo è quello che ho che funziona magnificamente;

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

CONSIDERAZIONI VALUTE -

  1. Sono consapevole del fatto che da qualsiasi luogo venga avviata la ricerca, tutte le mie Date vengono presentate in questo modulo 07/10/2015 10:25:09 PM da qui la mia capacità di sapere come formattare la Data per il confronto nel mio like espressione come "'%d/%m/%Y %r'" .
  2. Questo è solo un passaggio che funziona per Date. La maggior parte degli altri tipi, ad esempio int, long, char ... ecc... possono essere tutti trasmessi direttamente a String e mentre esploro più tipi di dati, farò sicuramente lo stesso per qualsiasi altro tipo che non può essere trasmesso direttamente a String .

Anche se questo funziona perfettamente per me, ma prima di contrassegnarlo come la risposta giusta, lo sottoporrò ad alcuni test più approfonditi e nel processo lo terrò aperto per i commenti di chiunque abbia qualche riserva sulla mia strategia.

E infine, a quella persona a cui questo ha aiutato in qualche modo... Saluti!