property name for and 12c 11g hibernate oracle11g formula intervals

name - Hibernate Oracle INTERVAL EXPRESSION y Oracle 11g Dialect



property name hibernate dialect mysql (1)

Necesito usar una EXPRESIÓN DE INTERVALO para un campo calculado. como abajo:

@Formula(" SYSDATE - INTERVAL ''1'' HOUR * SHOW_LIMIT_HOURS ") private Date showLimitDate;

Sin embargo, hibernate produce el siguiente fragmento de SQL considerando esta expresión como una columna.

and product0_.sold_at > ( SYSDATE - settings0_.INTERVAL ''1'' settings0_.HOUR * setting0_.SHOW_LIMIT_HOURS )

¿Alguien podría ayudarme?


Después de 2 días sufriendo, analizando el procesamiento de AST del código fuente de hibernación, ¡finalmente me rendí! = P .. De hecho, todavía no hay un dialecto Oracle 11g disponible.

Entonces, cambié la estrategia y la resolví con los siguientes cambios:

1. Cree la siguiente función en la base de datos Oracle

CREATE OR REPLACE FUNCTION INTERVAL_HOURS_AGO(HOURS_PARAM IN NUMBER) RETURN DATE DETERMINISTIC IS TIME_AGO DATE; BEGIN SELECT (SYSDATE - INTERVAL ''1'' HOUR * HOURS_PARAM) INTO TIME_AGO FROM DUAL; RETURN(TIME_AGO); END;

TIP DETERMINISTA sobre la función es muy importante para evitar problemas de rendimiento cuando se usa en Where-Clauses. Más información al respecto en el enlace: http://www.inside-oracle-apex.com/caution-when-using-plsql-functions-in-sql-statement/

2. Cree una clase de dialecto de Oracle personalizada y registre la nueva función.

public class Oracle11gDialectExtended extends Oracle10gDialect { public Oracle11gDialectExtended() { super(); registerFunction("interval_hours_ago", new StandardSQLFunction("INTERVAL_HOURS_AGO", StandardBasicTypes.DATE)); } }

Entonces, solo llámalo a @Formula:

@Formula(" INTERVAL_HOURS_AGO( SHOW_LIMIT_HOURS ) ") private Date showLimitDate;

O en HQL / NamedQuery:

select p from Product p where p.createdAt > interval_hours_ago(60)