Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Critérios de hibernação para datas


Por que você usa Restrictions.like(... )?

Você deve usar Restrictions.eq(...) .

Observe que você também pode usar .le , .lt , .ge , .gt em objetos de data como operadores de comparação. LIKE operador não é apropriado para este caso, pois LIKE é útil quando você deseja corresponder os resultados de acordo com o conteúdo parcial de uma coluna. Consulte http://www.sql-tutorial.net/SQL-LIKE.asp para obter a referência.

Por exemplo, se você tem uma coluna de nome com o nome completo de algumas pessoas, você pode fazer where name like 'robert %' para que você retorne todas as entradas com nome começando com 'robert ' (% pode substituir qualquer caractere).

No seu caso, você conhece o conteúdo completo da data que está tentando corresponder, portanto, não deve usar LIKE mas igualdade. Eu acho que o Hibernate não oferece nenhuma exceção neste caso, mas de qualquer forma você provavelmente terá o mesmo problema com o Restrictions.eq(...) .

Seu objeto de data que você obteve com o código:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
Date date = formatter.parse(myDate);

Este objeto de data é igual a 17-04-2011 às 0h, 0 minutos, 0 segundos e 0 nanossegundos.

Isso significa que suas entradas no banco de dados devem ter exatamente Aquela data. O que quero dizer é que, se a entrada do banco de dados tiver uma data "17-April-2011 19:20:23.707000000", ela não será recuperada porque você acabou de solicitar essa data:"17-April-2011 00:00:00.0000000000".

Se você quiser recuperar todas as entradas do seu banco de dados de um determinado dia, você terá que usar o seguinte código:
    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
    String myDate = "17-04-2011";
    // Create date 17-04-2011 - 00h00
    Date minDate = formatter.parse(myDate);
    // Create date 18-04-2011 - 00h00 
    // -> We take the 1st date and add it 1 day in millisecond thanks to a useful and not so known class
    Date maxDate = new Date(minDate.getTime() + TimeUnit.DAYS.toMillis(1));
    Conjunction and = Restrictions.conjunction();
    // The order date must be >= 17-04-2011 - 00h00
    and.add( Restrictions.ge("orderDate", minDate) );
    // And the order date must be < 18-04-2011 - 00h00
    and.add( Restrictions.lt("orderDate", maxDate) );