Tengo una tabla (en Oracle 9 y hasta donde yo necesita para encontrar todas las entradas de un día determinado usando Hibernate. Las entradas tienen marcas de tiempo (con datos de tipo ‘fecha’). Algunas de las entradas tienen un valor de tiempo, mientras que otros sólo tienen una fecha. Este no puede ser cambiado, ya que esta es la salida de otras aplicaciones que no puedo cambiar. En SQL que yo iba a escribir algo a lo largo de las líneas de

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

para obtener todas las entradas para la fecha que yo estoy buscando. Me preguntaba ¿cómo puedo obtener Hibernate para ello el uso de HQL. Sé que puedo utilizar consultas SQL en modo de Hibernación, pero esto parece ser menos limpio. Es allí una manera de hacer esto? Si es posible, de esta manera se debe trabajar en la no-bases de datos de oracle donde timestamp sería el tipo de datos.

OriginalEl autor Thomas Lötzer | 2009-06-11

4 Comentarios

  1. 14

    Podría poner dos restricciones en sus HQL, uno que especifica superior o igual a la de inicio de la fecha en que usted está buscando, y uno que especifica menos que el día siguiente.

    es decir,

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

    HQL (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 tanto >= y <= respectivamente.

    Más detalles sobre between aquí: http://www.coding-dude.com/wp/java/hibernate-java/hibernate-hql-between-expression/

    OriginalEl autor tschaible

  2. 2

    Creo que hay dos formas de solucionar esto:

    1. Utilizar un criterios de consulta y agregar un SQLRestriction. La restricción podría tomar la forma de «trim({alias}.fecha) = ?». Un problema puede ser la conversión del parámetro de entrada para el tipo correcto de Oracle (o de otros DBMS). Usted puede proporcionar la necesaria (hibernación) tipo de parámetro, pero si esto es dependiente base de datos, va a ser codificado.

    2. utilizar un fórmula en su mapeo hibernate. La asignación sería:

     <nombre de la clase="Persona"> 
    <propiedad nombre="cumpleaños" de la fórmula="trim" (cumpleaños)"/> 
    </clase>

    Ahora, usted puede usar el modo de Hibernación del sistema de escritura al utilizar una comparación con un objeto java como este:

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

    Uno de los problemas que tendrá con ambas soluciones es la trim función podría no estar disponible en la base de datos. Una solución para esto (por ejemplo, mientras que las pruebas en HSQLDB) es poner una importación.sql en el classpath de la prueba (este será recogido por Hibernar automáticamente) y crear un procedimiento o función. También puede Alter table Person add column birthDay timestamp en ese archivo para hacer el esquema generado trabajo.

    OriginalEl autor Maarten Winkels

  3. 2

    Para CustomHQL, usted puede probar el trunc palabra clave

    Por Ejemplo:

    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.

    Este es el truco para mí.

    OriginalEl autor user565390

  4. -1

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

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

    recopila todos los detalles de los empleados que estaban trabajando de 1 mes antes de

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

    OriginalEl autor Amar

Dejar respuesta

Please enter your comment!
Please enter your name here