Criterios de Hibernación para las Fechas


En oracle tengo fechas en formato

17-Abril-2011 19:20:23.707000000

Me gustaría recuperar todos los pedidos para 17-04-2011.

 SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
Date date = formatter.parse(myDate);
    Criteria criteria = 
                session.createCriteria(Order.class);
Criterion restrictDate = Restrictions.like("orderDate",date); 

Pero me trae un resultado vacío:

Author: danny.lesnik, 2011-04-26

3 answers

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

Debe usar Restrictions.eq(...).

Nota también puede utilizar .le, .lt, .ge, .gt objetos de fecha como operadores de comparación. El operador LIKE no es apropiado para este caso, ya que LIKE es útil cuando se desea hacer coincidir los resultados de acuerdo con el contenido parcial de una columna. Véase http://www.sql-tutorial.net/SQL-LIKE.asp para la referencia.

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

En su caso, usted sabe el contenido completo de la fecha que está tratando de coincidir, por lo que no debe usar LIKE sino la 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(...).

Su objeto de fecha que obtuvo 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 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 su entrada de base de datos tiene una fecha "17-April-2011 19:20:23.7070000000", entonces no se recuperará porque solo pide esa fecha: "17-April-2011 00:00:00.0000000000".

Si desea recuperar todas las entradas de su base de datos de un día determinado, tendrá que 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) ); 
 44
Author: Sebastien Lorber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-24 07:12:06

Usando esta manera puede obtener la lista de registros seleccionados.

GregorianCalendar gregorianCalendar = new GregorianCalendar();
Criteria cri = session.createCriteria(ProjectActivities.class);
cri.add(Restrictions.ge("EffectiveFrom", gregorianCalendar.getTime()));
List list = cri.list();

Todos los Registros se generarán en una lista que sea mayor o igual a '08-Oct-2012' o bien pasar la fecha de aceptación del usuario en 2do parámetro de Restricciones (gregorianCalendar.getTime()) de criterios para obtener los registros.

 5
Author: pudaykiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-03 14:44:41

Si la columna es una marca de tiempo, puede hacer lo siguiente:

        if(fromDate!=null){
            criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) >= TO_DATE('" + dataFrom + "','dd/mm/yyyy')"));
        }
        if(toDate!=null){               
            criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) <= TO_DATE('" + dataTo + "','dd/mm/yyyy')"));
        }

        resultDB = criteria.list();
 2
Author: Fabius Fusus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-06 13:58:15