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:
-
package br.com.dclick.hibernate.criterion.oracle;
-
-
import org.hibernate.Criteria;
-
import org.hibernate.EntityMode;
-
import org.hibernate.Hibernate;
-
import org.hibernate.HibernateException;
-
import org.hibernate.criterion.CriteriaQuery;
-
import org.hibernate.criterion.Criterion;
-
import org.hibernate.engine.TypedValue;
-
-
public class ExtractFunctionExpression implements Criterion {
-
-
private static final class ExtractType {
-
-
private String function;
-
-
this.function = function;
-
}
-
-
return function.toString();
-
}
-
-
}
-
-
public static final ExtractType YEAR = new ExtractType( "YEAR" );
-
public static final ExtractType MONTH = new ExtractType( "MONTH" );
-
public static final ExtractType DAY = new ExtractType( "DAY" );
-
-
private String property;
-
private String value;
-
private ExtractType extractType;
-
-
this.property = property;
-
this.extractType = extractType;
-
this.value = value;
-
}
-
-
public TypedValue[] getTypedValues( Criteria criteria, CriteriaQuery criteriaQuery ) throws HibernateException {
-
return new TypedValue[] { new TypedValue( Hibernate.STRING, value, EntityMode.POJO ) };
-
}
-
-
public String toSqlString( Criteria criteria, CriteriaQuery criteriaQuery ) throws HibernateException {
-
return "( extract(" + extractType.toString() + " from " + column + " ) = ? )";
-
}
-
-
}
Pronto. Agora e so adicionar ao seu criterio:
JAVA:
-
HibernateSessionFactory.getSession()
-
.createCriteria(Venda.class)
-
.add( new ExtractFunctionExpression("dataVenda", ExtractFunctionExpression.YEAR, "2007") )
-
.list();

