Extender criterion

0 respostas
boneazul

Olá a todos ,

Estou precisando implementar uma extensão de CRITERIA do hibernate para suportar operações aritméticas em campos de banco de dados
ex :

“where (column + (column * 0.2)) > select count(id) …”

Comecei implementando isso e enrosquei na parte de suporte a subselect :

package br.gov.sp.defensoria.common.hibernate.criterion;

import org.hibernate.Criteria;
import org.hibernate.EntityMode;
import org.hibernate.HibernateException;
import org.hibernate.criterion.CriteriaQuery;
import org.hibernate.criterion.Criterion;
import org.hibernate.engine.TypedValue;
import org.hibernate.type.StandardBasicTypes;



@SuppressWarnings("serial")
public class OperationExpression implements Criterion {

   
   private final String propertyName1;
   private final String propertyName2;
   private final Object value1;
   private final Object value2;

   public OperationExpression(String propertyName1, String propertyName2,Object value1,Object value2) {
      this.propertyName1 = propertyName1;
      this.propertyName2 = propertyName2;
      this.value1 = value1;
      this.value2 = value2;
   }

   public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
         throws HibernateException {
      
                  //value2 é uma instancia de DetachedCriteria

      return " ( " + criteriaQuery.getColumn(criteria, propertyName1) + " + ( " +
      criteriaQuery.getColumn(criteria, propertyName2) +" * "+ value1+ " )) > " +
                 //Como eu pego o sql que será gerado por esse objeto DetachedCriteria
                  value2);
   }

   public TypedValue[] getTypedValues(Criteria criteria,
         CriteriaQuery criteriaQuery) throws HibernateException {
   return new TypedValue[] {  new TypedValue(StandardBasicTypes.DOUBLE,value1,EntityMode.POJO)};                                                       
   }

   public String toString() {
      return " ( " + propertyName1 + " + ( " propertyName2 +" * "+ value1.toString()+ " )) > " + value2.toString());
   }

}

Quando tento rodar ele impleme o toString do objeto em vez do subselect que passei

(property + ( property* 0.2 )) > DetachedCriteria@fdsi9fd77 (toString() of detached criteria)

Sei que a pergunta é meio avançada mas como faria pra ele imprimir o sql certo em vez do toString() do objeto ???

Criado 6 de janeiro de 2012
Respostas 0
Participantes 1