DSL para facilitar consulta com o Criteria Builder do JPA.
A instancia de repository pode ser recuperada por CDI.
Para Recuperar o último registro:
repository.from(Aplicacao.class).last();
Para Recuperar o primeiro registro:
repository.from(Aplicacao.class).first();
Para Recuperar uma Coleção:
repository.from(Aplicacao.class).collection();
Para Recuperar uma Coleção paginada:
PaginatedMetaList<Aplicacao> metaList = repository.from(Aplicacao.class).collection(1, 1);
metaList.getMeta().getTotal();//total de itens em todosd as paginas
metaList.getMeta().getPage();//pagina atual
Para Remover uma entidade:
repository.remove(objetoHaSerRemovido);
Para Remover uma Coleção:
repository.from(Aplicacao.class).where("Teste", Aplicacao_.nome).remove();
Para contar os registros:
repository.from(Aplicacao.class).count();
Por padrão os registros são contados usando o distinct, caso não deseje isso use:
repository.from(Aplicacao.class).count(Boolean.FALSE);
Para ordenar o resultado:
repository.from(Aplicacao.class).orderBy(Order.Type.DESC, Aplicacao_.nome).list();
Para aplicar hint:
repository.hint("org.hibernate.readOnly", true);
Aplicando Predicados:
final Predicate p1 = new Predicate("Teste", Operacao_.nome);
final Predicate p2 = new Predicate("OutraOperacao", Comparators.NOT_EQUAL,
Operacao_.nome);
repository.from(Operacao.class).where(p1).and(p2).count();
Dentro dos Predicados podemos definir o tipo de junção, comparação e operação:
new Predicate(1l, JoinType.INNER, Comparators.EQUAL, Operators.OR,
Operacao_.recurso, Recurso_.id)
A operação também pode ser definida com um método na DSL:
final Predicate p1 = new Predicate("Teste", Operacao_.nome);
final Predicate p2 = new Predicate("OutraOperacao", Operacao_.nome);
final Predicate p3 = new Predicate("AindaOutraOperacao", Operacao_.nome);
repository.from(Operacao.class).where(p1).and(p2).or(p3).count();
Os atributos são recuperados pelo metamodel do JPA, e devem navegar da entidade definida no método from, até o atributo em que se deseja que o filtro seja aplicado. Por exemplo, tendo os modelos Operação -> Recurso -> Aplicação, e o vamos retorna as aplicações que tem uma operação relacionada com o nome que contém a string "teste", teriamos:
Predicate p = new Predicate("teste", Comparators.LIKE, Aplicacao_.recursos,
Recurso_.operacao, Operacao_.nome);
repository.from(Aplicacao.class).where(p).list();
O método EntityManager#flush é invocado automaticamente ao executar os métodos remove, save e update.
Podem selecionar também dados específicos de modelos diferentes:
public class NomeRecursoENomeAplicacao {
public String descricao;
public String nome;
public NomeRecursoENomeAplicacao(String descricao, String nome) {
this.descricao = descricao;
this.nome = nome;
}
}
List<NomeRecursoENomeAplicacao> objects = repository
.from(Aplicacao.class, NomeRecursoENomeAplicacao.class)
.select(Aplicacao_.descricao)
.select(Aplicacao_.recursos, Recurso_.nome)
.where(1, Comparators.GREATER_THAN_OR_EQUAL, Aplicacao_.id)
.list();
Para uso de tenant pode ser integrado ao projeto https://github.com/clairton/repository-tenant e https://github.com/clairton/tenant.
Para usar será necessário adicionar os repositórios maven:
<repository>
<id>mvn-repo-releases</id>
<url>https://raw.github.com/clairton/mvn-repo/releases</url>
</repository>
<repository>
<id>mvn-repo-snapshot</id>
<url>https://raw.github.com/clairton/mvn-repo/snapshots</url>
</repository>
Também adicionar as depêndencias:
<dependency>
<groupId>br.eti.clairton</groupId>
<artifactId>repository</artifactId>
<version>${latestVersion}</version>
</dependency>