Java >> Tutorial de Java >  >> Tag >> hibernate

Criterios de Hibernate para fechas

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

Deberías 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 de acuerdo con 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 el 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) ); 

De esta forma 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 pase la fecha de aceptación del usuario en el segundo parámetro de Restricciones (gregorianCalendar.getTime() ) de criterios para obtener los registros.


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();

Etiqueta Java