sql >> Database >  >> RDS >> Mysql

Hoe het datumveld voor een string te zoeken met behulp van de JPA Criteria API

Oké, na veel experimenteren met verschillende strategieën, is dit wat ik deed dat uiteindelijk werkte.

Ik zag dit bericht hier en herinnerde zich plotseling de JPA Tuple Interface die een object is dat meerdere resultaattype(s) kan retourneren. Dus om mijn like . uit te voeren vergelijking, en aangezien Datum niet eenvoudig naar een String kan worden gegoten, volgen hier de stappen;

  1. Ik krijg de kolom als een Tuple
  2. controleer het Tuple-object om te zien of het kan worden toegewezen vanaf Datum
  3. als dat zo is, pak dan de Date-Format-expressie en geef deze door aan de like uitdrukking.

Dus in wezen, dit is wat ik aanvankelijk had, wat blijkbaar niet werkte;

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

Dit is wat ik heb dat prachtig werkt;

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

OPMERKELIJKE OVERWEGINGEN -

  1. Ik ben me ervan bewust dat waar de zoekopdracht ook zou worden gestart, al mijn datums in deze vorm worden weergegeven 07/10/2015 10:25:09 PM vandaar mijn vermogen om te weten hoe ik de datum moet opmaken voor de vergelijking in mijn like uitdrukking als "'%d/%m/%Y %r'" .
  2. Dit is slechts één stap die werkt voor Dates. De meeste andere typen, zoals int, long, char ...etc... kunnen allemaal rechtstreeks naar string worden gegoten en naarmate ik meer soorten gegevens verken, zal ik zeker hetzelfde doen voor elk ander type dat niet rechtstreeks naar string kan worden gegoten .

Hoewel dit perfect werkt voor mij, maar voordat ik dit als het juiste antwoord markeer, ga ik het aan wat meer uitgebreide tests onderwerpen en in het proces houd ik het open voor commentaar door iedereen die bedenkingen heeft over mijn strategie.

En tot slot, aan die ene persoon dat dit op wat voor manier dan ook heeft geholpen... Proost!



  1. SQLite - Gegevens selecteren

  2. gebruik de If else-voorwaarde voor het selecteren van de kolom in mysql?

  3. Connect DATABASE Fout TYPE:2002:Toestemming geweigerd

  4. Een PHP-array opmaken voor een SQL IN-clausule