Work at SourceForge, help us to make it a better place! We have an immediate need for a Support Technician in our San Francisco or Denver office.

Close

#295 Error con fórmulas hibernate

v4.5
closed
nobody
None
5
2013-04-15
2012-09-28
Isabel Martinez
No

Desarrollamos sobre OX 4.1.2

@ReadOnly 
@org.hibernate.annotations.Formula\("Case " +

" when (" +
" (DATABAIXA IS NULL) AND " +
" (" +
" ((ESPENSIONISTA=1) AND (trunc(round(MONTHS_BETWEEN(sysdate,datanaixement)/12,1)))>=60) OR " +
" (ESTAVALORADAPCR=1) OR " +
" ((trunc(round(MONTHS_BETWEEN(sysdate,datanaixement)/12,1)))>=65) " +
" )" +
" ) then 1 " +
" else 0 end")
private boolean cumpleixRequisits;

Funciona perfectamente hasta que introducimos el campo en el modo lista y salen todos los campos salen #ERROR
El framework openxava realiza mal la sentencia URL:

=========================================================================================
Correcta:

SELECT BENESTAR.INSCRIPCIO.id, T_anyactiu.anyo, T_grup.nom, T_subgrup.nom, T_curs.nom, BENESTAR.INSCRIPCIO.dataInscripcio,
T_personainscrita.nom, T_personainscrita.cog1, T_estat.nom, BENESTAR.INSCRIPCIO.pagada, T_personainscrita.numPrematricula,
Case
when ( (DATABAIXA IS NULL) AND ( ((ESPENSIONISTA=1) AND (trunc(round(MONTHS_BETWEEN(sysdate,datanaixement)/12,1)))>=60) OR (ESTAVALORADAPCR=1) OR ((trunc(round(MONTHS_BETWEEN(sysdate,datanaixement)/12,1)))>=65) ) )
then 1
else 0
end
from BENESTAR.INSCRIPCIO
left join BENESTAR.CURS T_curs on BENESTAR.INSCRIPCIO.curs_id = T_curs.id left join BENESTAR.MAEANYACTIU T_anyactiu on T_curs.anyactiu_id = T_anyactiu.id left join BENESTAR.MAESUBGRUP T_subgrup on T_curs.subgrup_id = T_subgrup.id
left join BENESTAR.MAEGRUP T_grup on T_subgrup.grup_id = T_grup.id
left join BENESTAR.PERSONA T_personainscrita on BENESTAR.INSCRIPCIO.personainscrita_id = T_personainscrita.id
left join BENESTAR.MAEESTATINSCRIPCIO T_estat on BENESTAR.INSCRIPCIO.estat_id = T_estat.id
WHERE 1=1
order by BENESTAR.INSCRIPCIO.dataInscripcio
desc
=====================================================================================
y hace

#|2012-09-21T11:52:23.346+0200|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=21;_ThreadName=httpSSLWorkerThread-80-0;|11:52:23,345 ERROR [EntityTabDataProvider:38] Fallo al ejecutar SELECT BENESTAR.INSCRIPCIO.id, T_anyactiu.anyo, T_grup.nom, T_subgrup.nom, T_curs.nom, BENESTAR.INSCRIPCIO.dataInscripcio, T_personainscrita.nom, T_personainscrita.cog1, T_estat.nom, BENESTAR.INSCRIPCIO.pagada, T_personainscrita.numPrematricula, T_personainscrita.Case when ( (DATABAIXA IS NULL) AND ( ((ESPENSIONISTA=1) AND (trunc(round(MONTHS_BETWEEN(sysdate,datanaixement)/12,1)))>=60) OR (ESTAVALORADAPCR=1) OR ((trunc(round(MONTHS_BETWEEN(sysdate,datanaixement)/12,1)))>=65) ) ) then 1 else 0 end from BENESTAR.INSCRIPCIO left join BENESTAR.CURS T_curs on BENESTAR.INSCRIPCIO.curs_id = T_curs.id left join BENESTAR.MAEANYACTIU T_anyactiu on T_curs.anyactiu_id = T_anyactiu.id left join BENESTAR.MAESUBGRUP T_subgrup on T_curs.subgrup_id = T_subgrup.id left join BENESTAR.MAEGRUP T_grup on T_subgrup.grup_id = T_grup.id left join BENESTAR.PERSONA T_personainscrita on BENESTAR.INSCRIPCIO.personainscrita_id = T_personainscrita.id left join BENESTAR.MAEESTATINSCRIPCIO T_estat on BENESTAR.INSCRIPCIO.estat_id = T_estat.id WHERE 1=1 order by BENESTAR.INSCRIPCIO.dataInscripcio desc
java.rmi.RemoteException: Fallo al ejecutar SELECT BENESTAR.INSCRIPCIO.id, T_anyactiu.anyo, T_grup.nom, T_subgrup.nom, T_curs.nom, BENESTAR.INSCRIPCIO.dataInscripcio, T_personainscrita.nom, T_personainscrita.cog1, T_estat.nom, BENESTAR.INSCRIPCIO.pagada, T_personainscrita.numPrematricula, T_personainscrita.Case when ( (DATABAIXA IS NULL) AND ( ((ESPENSIONISTA=1) AND (trunc(round(MONTHS_BETWEEN(sysdate,datanaixement)/12,1)))>=60) OR (ESTAVALORADAPCR=1) OR ((trunc(round(MONTHS_BETWEEN(sysdate,datanaixement)/12,1)))>=65) ) ) then 1 else 0 end from BENESTAR.INSCRIPCIO left join BENESTAR.CURS T_curs on BENESTAR.INSCRIPCIO.curs_id = T_curs.id left join BENESTAR.MAEANYACTIU T_anyactiu on T_curs.anyactiu_id = T_anyactiu.id left join BENESTAR.MAESUBGRUP T_subgrup on T_curs.subgrup_id = T_subgrup.id left join BENESTAR.MAEGRUP T_grup on T_subgrup.grup_id = T_grup.id left join BENESTAR.PERSONA T_personainscrita on BENESTAR.INSCRIPCIO.personainscrita_id = T_personainscrita.id left join BENESTAR.MAEESTATINSCRIPCIO T_estat on BENESTAR.INSCRIPCIO.estat_id = T_estat.id WHERE 1=1 order by BENESTAR.INSCRIPCIO.dataInscripcio desc
at org.openxava.tab.impl.JDBCTabProvider.nextChunk(JDBCTabProvider.java:282)
at org.openxava.tab.impl.EntityTabDataProvider.nextChunk(EntityTabDataProvider.java:35)
at org.openxava.tab.impl.EntityTab.nextChunk(EntityTab.java:303)
at o

=======================================================================
TRAZA
=======================================================================
|#]

[#|2012-09-21T11:52:23.454+0200|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=21;_ThreadName=httpSSLWorkerThread-80-0;|11:52:23,453 ERROR [JDBCTabProvider:281] Fallo al ejecutar SELECT BENESTAR.INSCRIPCIO.id, T_anyactiu.anyo, T_grup.nom, T_subgrup.nom, T_curs.nom, BENESTAR.INSCRIPCIO.dataInscripcio, T_personainscrita.nom, T_personainscrita.cog1, T_estat.nom, BENESTAR.INSCRIPCIO.pagada, T_personainscrita.numPrematricula, T_personainscrita.Case when ( (DATABAIXA IS NULL) AND ( ((ESPENSIONISTA=1) AND (trunc(round(MONTHS_BETWEEN(sysdate,datanaixement)/12,1)))>=60) OR (ESTAVALORADAPCR=1) OR ((trunc(round(MONTHS_BETWEEN(sysdate,datanaixement)/12,1)))>=65) ) ) then 1 else 0 end from BENESTAR.INSCRIPCIO left join BENESTAR.CURS T_curs on BENESTAR.INSCRIPCIO.curs_id = T_curs.id left join BENESTAR.MAEANYACTIU T_anyactiu on T_curs.anyactiu_id = T_anyactiu.id left join BENESTAR.MAESUBGRUP T_subgrup on T_curs.subgrup_id = T_subgrup.id left join BENESTAR.MAEGRUP T_grup on T_subgrup.grup_id = T_grup.id left join BENESTAR.PERSONA T_personainscrita on BENESTAR.INSCRIPCIO.personainscrita_id = T_personainscrita.id left join BENESTAR.MAEESTATINSCRIPCIO T_estat on BENESTAR.INSCRIPCIO.estat_id = T_estat.id WHERE 1=1 order by BENESTAR.INSCRIPCIO.dataInscripcio desc
java.sql.SQLException: ORA-00923: FROM keyword not found where expected

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:316)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:282)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:639)

Discussion

  • Javier Paniza
    Javier Paniza
    2012-09-28

    Hola Isabel,
    en OX4.4.1 se resuelve un bug relacionado con @Formula, por eso prueba primero tu caso con la última versión de OpenXava y dime si sigue fallando.

     
  • Javier Paniza
    Javier Paniza
    2013-04-15

    Hola Isabel,

    el problema era que generaba esto:

    T_personainscrita.Case when
    

    calificando el Case. No debería poner el T_personainscrita.

    Desde la versión 4.5 de OpenXava debería funcionar bien, porque desde esa versión OX usa JPA para leer los datos de la vista y JPA/Hibernate debería generar bien la condición.

    No puedo probar tu caso concreto porque no tengo tu código fuente, pero asumo que está arreglado y cierro el bug. Si te sigue fallando reabre el bug y lo volveré a mirar.

     
  • Javier Paniza
    Javier Paniza
    2013-04-15

    • status: open --> closed
    • Group: v4.1.2 --> v4.5