DClick

Implementando Criterion para utilizar Extract do Oracle


Ontem meu amigo Filipe Sabella queria executar uma função para manipulação de data do Oracle utilizando Criteria. Algo do tipo funcao_do_oracle( columa ) = ?

O Hibernate não implementa esse tipo de funcionalidade, mas por ter seu desenvolvimento baseado em interfaces lhe possibilita extender / criar (quase) toda e qualquer funcionalidade que deseje. Depois de dar o caminho das pedras, dizendo que era "so" implementar Criterion e algumas alterações para deixarmos a mesma compativel com 1.4 chegamos a seguinte solução:

JAVA:
  1. package br.com.dclick.hibernate.criterion.oracle;
  2.  
  3. import org.hibernate.Criteria;
  4. import org.hibernate.EntityMode;
  5. import org.hibernate.Hibernate;
  6. import org.hibernate.HibernateException;
  7. import org.hibernate.criterion.CriteriaQuery;
  8. import org.hibernate.criterion.Criterion;
  9. import org.hibernate.engine.TypedValue;
  10.  
  11. public class ExtractFunctionExpression implements Criterion {
  12.  
  13.     private static final class ExtractType {
  14.  
  15.         private String function;
  16.  
  17.         private ExtractType( String function ) {
  18.             this.function = function;
  19.         }
  20.  
  21.         public String toString() {
  22.             return function.toString();
  23.         }
  24.  
  25.     }
  26.  
  27.     public static final ExtractType YEAR = new ExtractType( "YEAR" );
  28.     public static final ExtractType MONTH = new ExtractType( "MONTH" );
  29.     public static final ExtractType DAY  = new ExtractType( "DAY" );
  30.    
  31.     private String property;
  32.     private String value;
  33.     private ExtractType extractType;
  34.    
  35.     public ExtractFunctionExpression( String property, ExtractType extractType, String value ) {
  36.         this.property = property;
  37.         this.extractType = extractType;
  38.         this.value = value;
  39.     }
  40.  
  41.     public TypedValue[] getTypedValues( Criteria criteria, CriteriaQuery criteriaQuery ) throws HibernateException  {
  42.         return new TypedValue[] { new TypedValue( Hibernate.STRING, value, EntityMode.POJO ) };
  43.     }
  44.  
  45.     public String toSqlString( Criteria criteria, CriteriaQuery criteriaQuery ) throws HibernateException {
  46.         String column = criteriaQuery.getColumnsUsingProjection( criteria, property )[ 0 ];
  47.         return "( extract(" + extractType.toString() + " from " + column + " ) = ? )";
  48.     }
  49.  
  50. }

Pronto. Agora e so adicionar ao seu criterio:

JAVA:
  1. HibernateSessionFactory.getSession()
  2. .createCriteria(Venda.class)
  3. .add( new ExtractFunctionExpression("dataVenda", ExtractFunctionExpression.YEAR, "2007") )
  4. .list();

Por Daniel Passos em 14/November/2007 | Comentar | Trackback


No Translations

Adicionar comentário

(requerido)
(requerido, não será publicado)