with generic data java oracle hibernate java-ee criteria

java - generic - spring boot with hibernate



Criterios de Hibernate para las fechas (3)

¿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 LIKE 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. Por favor, consulte 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 hacer un where name like ''robert %'' para que regrese todas las entradas cuyo nombre comience por ''robert '' ( % puede reemplazar cualquier caracter).

En su caso, usted conoce el contenido completo de la fecha que intenta emparejar, por lo que no debe usar LIKE sino igualdad. Supongo que Hibernate no le da ninguna excepción en este caso, pero de todos modos probablemente tenga 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 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 su entrada en la base de datos tiene una fecha "17 de abril de 2011 19: 20: 23.707000000", no se recuperará porque solo solicita esa fecha: "17 de abril de 2011 a las 00:00: 00.0000000000 ".

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

En Oracle tengo fechas en formato

17 de abril de 2011 19: 20: 23.707000000

Me gustaría recuperar todos los pedidos para el 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:


Al usar 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 serán generados en una lista que sea mayor o igual que ''08 -Oct-2012 ''o bien pase la fecha de aceptación del usuario en el 2do parámetro de Restricciones ( gregorianCalendar.getTime() ) de los 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();