2009-06-11 27 views
15

Tengo una tabla (en Oracle 9 en adelante) donde necesito encontrar todas las entradas para un día determinado usando Hibernate. Las entradas tienen marcas de tiempo (con el tipo de datos 'fecha'). Algunas de las entradas tienen un tiempo, otras solo tienen una fecha. Esto no se puede cambiar, ya que este es el resultado de otras aplicaciones que no puedo cambiar. En SQL escribiría algo a lo largo de las líneas deUso de HQL para consultar una fecha sin tener en cuenta la hora en Oracle

SELECT * FROM table WHERE trim(table.date) = to_date('11.06.2009') 

para obtener todas las entradas para la fecha que estoy buscando. Me preguntaba cómo puedo hacer que Hibernate haga esto usando HQL. Sé que puedo usar SQL-consultas en Hibernate, pero esto parece ser menos limpio. ¿Hay alguna forma de hacer esto? Si es posible, de esta manera también debería funcionar en bases de datos que no sean Oracle, donde la marca de tiempo sería el tipo de datos.

Respuesta

14

Puede poner dos restricciones en su HQL, una que especifique mayor o igual que el inicio de la fecha en la que está buscando, y una que especifique menos que el día siguiente.

decir

table.date >=11.06.2009 AND table.date < 11.07.2009 

HQL (así como SQL) también permite:

table.date between 11.06.2009 AND 11.07.2009 

Tenga en cuenta between siempre está incluido, lo que significa que es tanto >= y <= respectivamente.
Más detalles sobre between aquí: http://www.coding-dude.com/wp/java/hibernate-java/hibernate-hql-between-expression/

2

creo que hay dos maneras de resolver este:

  1. utilizar una consulta criteria y añadir un SQLRestriction. La restricción tomaría la forma "trim ({alias} .date) =?". Un problema aquí podría ser la conversión del parámetro de entrada al tipo correcto en Oracle (u otro DBMS). Puede proporcionar el parámetro necesario (hibernación) como parámetro, pero si esto depende de la base de datos, estará codificado.

  2. usa un formula en tu mapeo de hibernación. El mapeo sería:

 <class name="Person"> 
     <property name="birthDay" formula="trim(birthDay)"/> 
    </class>

Ahora puede utilizar el sistema de tipificación de Hibernate utilizar un comparan con un objeto java como esto:

s.createCriteria(Person.class) 
.add(Restrictions.eq("birthDay", new java.sql.Date(System.currentTimeMillis()))) 
.list() 

Uno de los problemas que tendrá con las dos soluciones es la función trim podría no estar disponible en la base de datos. Una solución para esto (por ejemplo, mientras se prueba en HSQLDB) es poner un import.sql en su prueba de ruta de clase (esto será recogido por Hibernate automáticamente) y crear un procedimiento o función allí. También puede Alter table Person add column birthDay timestamp en ese archivo para que el esquema generado funcione.

-1

puede usar la función trunc() para eliminar la parte de tiempo en la columna FECHA.

por ejemplo: select * from emp where trunc(emp_date) < trunc(current_date()-30)

Obtiene todos los detalles de los empleados que fueron empleados 1 mes antes del

+8

y si es febrero? – Setori

+0

No es una buena idea trabajar con valores constantes, como dijo Setori, hay meses con menos de 30 días y otros con 31 días. – will824

2

Para CustomHQL, puede intentar la trunc palabra clave

Por Ej:

SELECT T0.FirstName as FirstName ,T0.LastLoginDate as LastLoginDate FROM User T0 
WHERE (trunc(T0.LastLoginDate) >= :LastLoginDate) ORDER BY T0.LastLoginDate 

NOTA: Donde :LastLoginDate es un parámetro.

Esto hace el truco para mí.

Cuestiones relacionadas