2010-09-09 26 views
14

¿Cómo puedo escribir una consulta JPA utilizando la función MONTH como la consulta sql?JPA Query funciones MES/AÑO

@NamedQuery(name="querybymonth", query="select t from table1 t where MONTH(c_Date) = 5") 

Cuando utilizo el patrón anterior de consulta, me sale un error: unexpected token - MONTH.

Respuesta

19

Si está utilizando EclipseLink (2.1) puede usar la función FUNC() para llamar a cualquier función de base de datos que no esté definida en la especificación JPA JPQL.

es decir FUNC ('MES', C_DATE)

En JPA 2.1 (EclipseLink 2.5) la sintaxis FUNCTION se convierte en parte de la especificación (y sustituye a la FUNC EclipseLink-específico).

Si está utilizando TopLink Essentials, no puede hacer esto en JPQL, pero puede definir una consulta TopLink Expression para él (similar a los criterios JPA 2.0) o utilizar SQL nativo.

Además, si está utilizando cualquier proveedor de JPA 2.0 y utiliza una consulta Criteria, hay una API de función() que se puede usar para definir esto.

+0

Hola James, gracias por tu respuesta. De hecho, estoy usando toplink essentials. Apliqué el camino como antes, pero aún así obtengo: Token inesperado - FUNC. Por favor ayuda! – venomrld

+0

@venomrld Como escribió James, este material FUNC está disponible en EclipseLink 2.1+, ver [Error 300512] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=300512). Así que no espere encontrarlo en TopLink Essentials. –

+0

Así que estoy atascado. Por favor ayuda si existe alguna forma. Estoy usando netbeans 6.5 y caras visuales para el desarrollo. Parece que tengo que cambiar casi todo el código para migrar. – venomrld

3

La función MONTH() existe en Hibernate HQL, pero no es una función JPA estándar. Tal vez su proveedor de JPA tiene algún equivalente propietario pero no lo mencionó. Si no es así, recurra a SQL nativo.


I am using Toplink Essentials for the same. Please help, if any function exists in Toplink. Thanks.

Que yo sepa, TopLink no tiene un equivalente directo. Por lo tanto, utilice una consulta SQL nativa o una consulta TopLink Expression (no estoy seguro de esto, y no estoy seguro de que esté disponible en TopLink Essentials).

+0

¡Hola! Estoy usando Toplink Essentials para lo mismo. Por favor, ayuda, si existe alguna función en Toplink. Gracias. – venomrld

6

que desea consultar AÑO (itemDate) pero la función no sale, entonces vi a la función SUBSTRING() Así que lo que hice fue Select q from table where SUBSTRING(itemDate, 1, 4)='2011' y funciona para mí! ¡Espero eso ayude!

si necesita una variable dinámica, puede hacerlo también. aquí: poDate es el año que se define en setParameter();

@NamedQuery(name = "PurchaseOrders.findByYear", query = "SELECT p FROM PurchaseOrders p WHERE SUBSTRING(p.poDate, 1, 4) = :poDate") 

Query q = em.createNamedQuery("PurchaseOrders.findByYear"); 
q.setParameter("poDate", s_year+""); 

pero si está de acuerdo con sus soluciones, eso estará bien. Acabo de encontrar que JPA es más rápido de ejecutar.

+0

Gracias por la respuesta .. En realidad, el problema que estoy enfrentando es que los valores son dinámicos ... es decir, Los valores están tomados de variables solamente ... Así que cambié a consultas SQL nativas y funcionan muy bien. De todos modos, gracias de nuevo. – venomrld

1

Lo siguiente funcionó para mí con Hibernate (4.3.9.Final) & JPA 2.1.

@NamedQuery (name = "PartyEntity.findByAID", query = "select psc.party distinta de PartyShortCode PSC, donde (= psc.shortCode: aidNumber o FUNCIÓN ('reemplazar', psc.accountReference,' '' ') =: aidNumber) y psc.sourceSystem en: sourceSystem ")