Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como pesquisar o campo de data para uma String usando a API JPA Criteria


Ok, depois de muitas experiências com várias estratégias, aqui está o que eu fiz que finalmente funcionou.

Eu vi esta postagem aqui e de repente me lembrei do JPA Tuple Interface que é um objeto que pode retornar vários tipos de resultado. Então, para executar meu like comparação, e como Date não pode ser simplesmente convertido em uma String, aqui estão as etapas;
  1. Recebo a coluna como uma Tuple
  2. verifique o objeto Tuple para ver se ele pode ser atribuído a partir de Data
  3. se for, obtenha a expressão Date-Format e passe-a para o like expressão.

Então, essencialmente, aqui está o que eu tinha inicialmente que aparentemente estava falhando;
predicates.add(cb.like(cb.lower(entity.get("dateJoined").as(String.class)), "%"+search.toLowerCase()+"%")); 

Agora, isso é o que eu tenho que funciona lindamente;
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()+"%"));
}

CONSIDERAÇÕES dignas de nota -
  1. Estou ciente de que, de onde quer que a pesquisa seja iniciada, todas as minhas datas são apresentadas neste formulário 07/10/2015 10:25:09 PM daí minha capacidade de saber como formatar a data para a comparação no meu like expressão como "'%d/%m/%Y %r'" .
  2. Esta é apenas uma etapa que funciona para Datas. A maioria dos outros tipos, por exemplo, int, long, char ... etc... podem ser todos convertidos diretamente em string e, à medida que exploro mais tipos de dados, definitivamente farei o mesmo para qualquer outro tipo que não possa ser convertido diretamente em string .

Embora isso funcione perfeitamente para mim, mas antes de marcar isso como a resposta correta, vou submetê-lo a alguns testes mais extensos e, no processo, mantê-lo aberto para comentários de qualquer pessoa que tenha alguma reserva sobre minha estratégia.

E finalmente, para aquela pessoa que isso ajudou de alguma forma... Saúde!