2012-01-11 9 views
5

I tienen esta claseCómo utilizar @Formula (en Hibernate) para referirse al mismo objeto (actual)

@Entity 
@Table(name = "DB.APPL_SESSION") 
@AttributeOverrides({@AttributeOverride(name = "id", column = @Column(name = "APPL_SESSION_ID"))}) 
@SequenceGenerator(name = "TableSequence", sequenceName = "DB.APPL_SESSION_SQ") 

public class AiSession{ 

@Formula("(select sum(nvl(budg.AMT_OV,budg.AMT)) from DB.BUDGET budg where budg.APPL_SESSION_ID = APPL_SESSION_ID)") 
private LocalDate realSessionStartDate; 

En la fórmula anterior que estaba trabajando con objeto DB.BUDGET y con la corriente de ID de objeto (APPL_SESSION_ID). Pero ahora quería sólo para trabajar con la siguiente variable miembro (StartDate), que está en la clase AidApplicantYearSession

@Basic 
@Temporal(TemporalType.DATE) 
@Column(name = "START_OV_DT") 
private Date overrideStartDate; 

¿Cómo debería escribir una fórmula que se parece a la anterior, pero utiliza sólo en la variable de miembro del objeto? Se me ocurrió con

@Formula("(select START_OV_DT from DB.APPL_SESSION)") 

¿Es esa la forma correcta? La lógica para las dos fórmulas es totalmente diferente.

Respuesta

5

@Formula se inserta simplemente en la cláusula SQL select, por lo que puede utilizar los nombres de columna en ella:

@Formula("START_OV_DT") 

Ver también:

+0

Gracias por su respuesta. En la documentación, dice "A veces, quiere que la base de datos haga algunos cálculos para usted en lugar de hacerlo en la JVM". ¿Cuál es más eficiente (haciendo el cálculo en la JVM o dejando que la Base de Datos realice algún cálculo) si se trata de una fórmula más compleja? – WowBow

+0

Olvidé mencionar que también debería usar la función NVL. Así es como lo hice @Formula ("(seleccione NVL (START_OV_DT, START_DT)") ¿Omitir la selección será lo mismo que guardarla? – WowBow

+1

@MatX: no creo que tenga sentido usar '@ Formula' para cálculos que pueden hacerse fácilmente en el lado de la aplicación. Sí, debería estar bien para múltiples campos. – axtavt

0

I tener una tabla que tenga el número total de bloques BITX_SESSION.TOTAL BLOCKS

Ahora necesito calcular el porcentaje de otra tabla que tiene el número de bloques que recibió BITX_SESSION_DEVICE.BLOCKS_RECEIVED Ambas tablas tienen session_id para identificar la sesión que necesito.

La salida que necesito es el porcentaje de bloques recibidos (BLOCKS_RECEIVED/TOTAL BLOCKS * 100). No estoy seguro de cómo escribirlo usando Fórmula.

Cuestiones relacionadas