* @see org.hibernate.type.Type
* @see org.hibernate.metadata.ClassMetadata
*
*/
private DetachedCriteria mountCriteriaForFindByAttributes(T entity, final String sortField, final Boolean sortOrder) {
DetachedCriteria criteria = DetachedCriteria.forClass(getPersistentClass());
SessionFactory sessionFactory = ht.getSessionFactory();
ClassMetadata meta = sessionFactory.getClassMetadata(getPersistentClass());
String[] propertyNames = meta.getPropertyNames();
Type[] propertyTypes = meta.getPropertyTypes();
Object[] propertyValues = meta.getPropertyValues(entity, EntityMode.POJO);
/*
* Adicionando o atributo identificador único(id) caso o mesmo tenha
* sido informado e exista um atributo chave.
*/
if (entity.getId() != null && meta.getIdentifierPropertyName()!=null) {
criteria.add(Restrictions.eq(meta.getIdentifierPropertyName(), entity.getId()));
}
/*
* Varrendo todos os atributos da entidade. Como na listagem não consta
* o atributo identificador único(id), este foi observado na rotina anterior.
*/
log.debug("Iniciando o processo de composição da consulta para método FindByAttributes.");
for ( int i=0; i<propertyNames.length; i++ ) {
String name = propertyNames[i];
Type type = propertyTypes[i];
Object value = propertyValues[i];
log.debug("Nome do atributo:" + name + " - Tipo (Hibernate):" + type.getName() + " - Valor:" + value);
// Se o atributo tem um valor definido.
if (value != null) {
if (!type.isCollectionType()) {
log.debug("Atributo adicionado: " + name);
FindByAttribute findByAttibute = getFindByAttributeAnnotation(name);
if (findByAttibute == null) {
if (type instanceof StringType) {
criteria.add(Restrictions.like(name, "%" + value + "%"));
} else {
criteria.add(Restrictions.eq(name, value));
}
} else {
if (type instanceof StringType) {
StringComparation stringComparation = findByAttibute.stringComparation();
if(stringComparation != null && stringComparation == StringComparation.EXACT) {
criteria.add(Restrictions.eq(name, value));
} else if(stringComparation != null && stringComparation == StringComparation.END) {
criteria.add(Restrictions.like(name, "%" + value));
} else if(stringComparation != null && stringComparation == StringComparation.START) {
criteria.add(Restrictions.like(name, value + "%"));
} else {
criteria.add(Restrictions.like(name, "%" + value + "%"));
}
} else if (type instanceof TimestampType) {
DateComparation dateComparation = findByAttibute.dateComparation();
if(dateComparation != null && dateComparation == DateComparation.EXACT) {
criteria.add(Restrictions.eq(name, value));
} else if(dateComparation != null && dateComparation == DateComparation.GREATER_THAN) {
criteria.add(Restrictions.ge(name, value));
} else if(dateComparation != null && dateComparation == DateComparation.LESS_THAN) {
criteria.add(Restrictions.le(name, value));
} else if(dateComparation != null && dateComparation == DateComparation.EXACT_DMY) {
Date dataInicial = DateUtils.truncate(value, Calendar.DAY_OF_MONTH);
Date dataFinal = DateUtils.addMilliseconds(dataInicial, ONE_DAY_IN_MILLISECONDS);
criteria.add(Restrictions.between(name, dataInicial, dataFinal));
}
} else {
criteria.add(Restrictions.eq(name, value));
}
}
} else {
log.debug("Atributo não adicionado por ser uma coleção: " + name);
}
} else {
log.debug("Atributo não adicionado por estar \"null\": " + name);
}
}
if (sortField != null) {
String[] fields = sortField.split("\\,");
for (String field : fields) {
if (field.split("\\.").length == 1) {
log.debug("Adicionando resultado da consulta por ordem do campo "+field.trim()+" SEM criação de alias");
if (sortOrder) {
log.debug("Ordenação adicionada: " + sortField + " ASC");
criteria.addOrder(Order.asc(sortField));
} else {
log.debug("Ordenação adicionada: " + sortField + " DESC");
criteria.addOrder(Order.desc(sortField));
}
} else {
String innerClass = field.split("\\.")[0].trim();
String innerAttribute = field.split("\\.")[1].trim();
log.debug("Adicionando resultado da consulta por ordem do campo "+innerClass+"."+innerAttribute+" COM criação de alias");
if (sortOrder) {
log.debug("Ordenação adicionada: " + sortField + " ASC");
criteria.createAlias(innerClass, innerClass).addOrder(Order.asc(innerClass+"."+innerAttribute));
} else {
log.debug("Ordenação adicionada: " + sortField + " DESC");
criteria.createAlias(innerClass, innerClass).addOrder(Order.desc(innerClass+"."+innerAttribute));
}
}
}