2011-11-24 14 views
7

Dire che ho un'entità MyEntity e ha una proprietà basata su formula fmlaProp. Ora dico creo un criterio:Sospensione - Criteri di ordinamento per proprietà formula

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

in questo caso ottengo il seguente SQL:

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

che dà un errore dicendo che Oracle order-by l'espressione non è selezionato. Poi ho provato i seguenti criteri:

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

Che genera "ordine di alias1" che funziona correttamente. Ma è un po 'brutto - il codice deve "conoscere" le proprietà della formula, che viola il principio "scrivi una volta". Qualche idea o suggerimento su questo? Grazie in anticipo.

+1

Qual è la parte '-sql'? – cherouvim

risposta

1

Questo è il comportamento previsto da Hibernate. Non ha a che fare con la proprietà della formula in modo specifico, ma si desidera eseguire l'ordine con un valore proiettato. Dalla Hibernate Docs:

Un alias può essere assegnato ad una proiezione in modo che il valore previsto può essere riferito a restrizioni o ordinamenti. Ecco due modi diversi per farlo ...

Per quanto riguarda le alternative, è possibile provare a rendere la proprietà formula una colonna virtuale (nelle versioni di Oracle 11 e successive) o avvolgere la tabella in una vista con questa colonna calcolata. In questo modo, Oracle conoscerà direttamente fmlaprop, che può essere utilizzato proprio come una colonna "normale".

Problemi correlati