2011-11-24 25 views
7

Digamos que tengo una entidad MyEntity, y tiene una propiedad basada en fórmula fmlaProp. Ahora digo creo un criterio:Hibernate - Criterios de ordenamiento por fórmula propiedad

s.createCriteria(MyEntity.class) 
    .setProjection( 
     Projections.distinct( 
      Projections.property("fmlaProp"))) 
    .addOrder(Order.asc("fmlaProp")); 

en este caso me sale el siguiente SQL:

SELECT DISTINCT fmlaProp-sql FROM MY_ENTITY_TABLE ORDER BY fmlaProp-sql 

cual da un error en Oracle diciendo que el fin-de expresión es no seleccionados. Luego probé los siguientes criterios:

s.createCriteria(MyEntity.class) 
    .setProjection( 
     Projections.distinct(
      Projections.alias(
       Projections.property("fmlaProp"), 
       "alias1")) 
    .addOrder(Order.asc("alias1")); 

Lo que genera "orden por alias1" que funciona bien. Pero es algo feo: el código debe "conocer" esas propiedades de la fórmula, lo que viola el principio de "escribir una vez". ¿Alguna idea o sugerencia sobre eso? Gracias de antemano.

+1

¿Qué es la parte '-sql'? – cherouvim

Respuesta

1

Este es el comportamiento esperado de Hibernate. No tiene que ver específicamente con la propiedad de la fórmula, sino que desea hacer un pedido con un valor proyectado. Del Hibernate Docs:

Se puede asignar un alias a una proyección para que el valor proyectado pueda consultarse en restricciones u ordenamientos. Aquí hay dos maneras diferentes de hacerlo ...

En cuanto a las alternativas, podría tratar de hacer que la propiedad de fórmula sea una columna virtual (en versiones de Oracle 11 y superiores) o envolver la tabla en una vista con este columna calculada De esta forma, Oracle sabrá fmlaprop directamente, que se puede usar como una columna "normal".

Cuestiones relacionadas