sql >> Base de Datos >  >> RDS >> Oracle

Criterios de Hibernate para fechas

¿Por qué usa Restrictions.like(... )?

Debe usar Restrictions.eq(...) .

Tenga en cuenta que también puede usar .le , .lt , .ge , .gt en objetos de fecha como operadores de comparación. LIKE operador no es apropiado para este caso ya que LIKE es útil cuando desea hacer coincidir los resultados según el contenido parcial de una columna. Consulte http://www.sql-tutorial.net/SQL-LIKE.asp para obtener una referencia.

Por ejemplo, si tiene una columna de nombre con el nombre completo de algunas personas, puede hacer where name like 'robert %' para que devuelva todas las entradas con un nombre que comience con 'robert ' (% puede reemplazar cualquier carácter).

En su caso, conoce el contenido completo de la fecha que está tratando de hacer coincidir, por lo que no debe usar LIKE pero igualdad. Supongo que Hibernate no te da ninguna excepción en este caso, pero de todos modos probablemente tendrás el mismo problema con Restrictions.eq(...) .

Tu objeto de fecha que obtuviste con el código:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
Date date = formatter.parse(myDate);

Este objeto de fecha es igual al 17-04-2011 a las 0h, 0 minutos, 0 segundos y 0 nanosegundos.

Esto significa que sus entradas en la base de datos deben tener exactamente esa fecha. Lo que quiero decir es que si la entrada de su base de datos tiene una fecha "17-abril-2011 19:20:23.707000000", entonces no se recuperará porque solo solicita esa fecha:"17-abril-2011 00:00:00.0000000000".

Si desea recuperar todas las entradas de su base de datos de un día determinado, deberá utilizar el siguiente 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) );