Estou usando Hibernate, e gostaria de saber o seguinte...
Digamos que eu faça uma pesquisa de todos os meus carros que tenho no banco, depois eu quero fazer outra pesquisa, apenas dos carros de uma montadora, o que é mais rapido ??
1° refazer a consulta ao banco de dados, pedindo pra listar apenas os itens da montadora especifica ??
2° filtrar a coleção de carros seguindo o padrão filter conforme é explicado abaixo ??
Obs.: Duvida, o hibernate não vai manter instancias duplicadas com os mesmo dados ?? conciderando que na 1° pesquisa eu teria instancia de todos os carros, e na 2° instancia somente dos carros de uma montadora ?? e que ainda assim vou manter a 1° coleção, e quem sabe depois fazer consulta sobre outras montadoras ?? isso não prejudicaria a memoria da minha aplicação ??
A duvida basica é se ficar consultado o banco para cada filtro é pior que consultar a collection já existente na memoria, e se ficar consultando o banco não duplicaria instnacias de itens já existentes na memoria, o que não ocorre no caso das consultas por filtros
Desde ja agradeço
...................
Abaixo segue a forma de fazer o filtro por Coleções
inteface Filter<T>public interface Filter<T> {
public boolean match (T object);
}
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
public class CollectionUtil {
/**
* Filtra a coleção enviada, de acordo com o filtro passado, permanecendo na coleção
* apenas os itens que atendem ao filtro.
* <BR>
* <b>A coleção original enviada será modificada</b>.
* @param <T> O tipo do objeto a ser pesquisado.
* @param candidates a lista de objetos a serem filtrados, que devem ser do tipo T
* @param filter o filtro a ser realizado
* @return A mesma coleção enviada como parametro, que ja terá seus dados filtrados.
*/
public static <T> Collection<T> filter(final Collection<T> candidates,
final Filter<T> filter) {
for (Iterator<T> it = candidates.iterator(); it.hasNext(); )
if (!filter.match(it.next()))
it.remove();
return candidates;
}
/**
* Consulta a coleção enviada, de acordo com o filtro passado, criando uma nova coleção
* com apenas os itens que atendem ao filtro.
* <BR>
* <b>A coleção original enviada <u>NÃO</u> será modificada</b>.
* @param <T> O tipo do objeto a ser pesquisado.
* @param candidates a lista de objetos a serem filtrados, que devem ser do tipo T
* @param filter o filtro a ser realizado
* @return Uma nova coleção com apenas os itens que atendem o filtro.
*/
public static <T> List<T> query(final Collection<T> candidates,
final Filter<T> filter) {
List<T> results = new ArrayList<T>(candidates);
for (Iterator<T> it = results.iterator(); it.hasNext(); )
if (!filter.match(it.next()))
it.remove();
return results;
}
}
private class MontadoraFilter implements Filter<Carro> {
private static final int montadoraId;
public MontadoraFilter(final int montadoraId) {
this.montadoraId = montadoraId;
}
public boolean match(Carro carro) {
return carro.getMontadora().getId() == montadoraId;
}
}
Collection<Carro> todosOsCarros = Repositories.list(Carro.class);
carrosDaChevrolet = CollectionUtils.query(todosOsCarros,new MontadoraFilter(1));
carrosDaVolks = CollectionUtils.query(todosOsCarros,new MontadoraFilter(5));
//Não vou listar como fazer via hibernate pq acredito que todos saibam ^^