[quote=tnaires][quote=danielbussade]Então Tnaires, mas o repositorio não seria apenas uma interface? Antes eu teria que criar o Criterion, esse que e o problema onde criar este criterion.
Como você faz atualmente?[/quote]
Sim, o repositório pode ser uma interface, mas o que é uma interface sem sua implementação? Não funciona. Por exemplo, você acha que java.sql.Connection é apenas uma interface? O driver JDBC tem uma classe que implementa a interface Connection, mas ela não está visível pra nós.
Quando você constrói o repositório, é prudente sim fazer com que as classes externas ao pacote enxerguem apenas a interface, mas a implementação, apesar de não ser visível externamente, existe. E é ela que utilizará Criteria, HQL, SQL, XML ou o que for. E a vantagem de usar interfaces é que, se um dia sua aplicação deixar de utilizar JDBC para utilizar Hibernate, teoricamente será preciso apenas trocar as implementações dos repositórios - claro que outras mudanças relativas à configuração também serão necessárias.
Vejamos um exemplo. Temos um cadastro de clientes e temos uma consulta por nome do cliente. Haverá uma interface pública para o repositório de clientes:
[code]package domain;
public interface CustomerRepository {
Collection findByName(String name);
}[/code]Teremos sua implementação invisível para as classes fora do pacote. Note a visibilidade default para a classe:
[code]package domain;
class HibernateCustomerRepository implements CustomerRepository {
public Collection findByName(String name) {
// Código que cria um objeto Criteria e recupera os clientes cujo nome começam com “name”
return result;
}
}[/code]E agora temos uma das possíveis formas de disponibilizar o repositório para as camadas que o utilizam, através de uma factory:
[code]package domain;
public class RepositoryFactory {
public static CustomerRepository getCustomerRepository() {
return new HibernateCustomerRepository();
}
}[/code]E se um dia der uma doida e tivermos que mudar de Hibernate para JDBC, será preciso criar uma nova implementação para o repositório…
[code]package domain;
class JDBCCustomerRepository implements CustomerRepository {
public Collection findByName(String name) {
// Código que cria um objeto PreparedStatement e executa um SQL para recuperar os clientes cujo nome começam com “name”
return result;
}
}[/code]… e mudar o código da fábrica:
[code]package domain;
public class RepositoryFactory {
public static CustomerRepository getCustomerRepository() {
//return new HibernateCustomerRepository();
return new JDBCCustomerRepository();
}
}[/code]Foi um exemplo muito simples, mas que ilustra o que quero dizer.[/quote]
Olá tnaires, é exatamente assim que faço. Mas o que quis dizer foi o seguinte, digamos que amanha vc queira pesquisar por login, e depois por cidade, teria que criar tres metodos certo?
findByLogin,
findByCidade
O que estou querendo fazer é ter um metodo bem generico, no repository, tipo como falei.
getByCriterion(Criterion);
e na implementacao seria
Criteria c=session.createCriteria(classe);
c.add(criterion);
Assim teria uma pesquisa generica podendo colocar OrderBy , Projections, etc.
O problema é que tenho q entregar este criterio pronto, vindo de outro lugar. Ai pergunto onde seria o melhro lugar para montar esse criterion.
Hj estou montando na Apresentação mas isso viola camadas, além de ficar feio.
Entendeu a minha duvida!
Onde, poderia colocar a montagem desses criterions?