DEV Community

Guilherme Alves
Guilherme Alves

Posted on

Consultas de criterios ou "criteria" usando o metamodelo

o que é Metamodelo JPA?

o JPA é enorme e lindo!, completo e abrange quase todos os aspectos da comunicacao entre banco de dados relacionais, e frequentemente quando escrevemos consultas utilizando criterios ou as famosas "criterias" , precisamos fazer referencia as classes de entidade e atributos que estamos fazendo a consulta.
Uma das maneiras claro e fornecer os nomes dos atributos como string que estamos consultando, mas isso gera mais desvantagens do que vantagem, e aceito voce utilizar as consultas por string num projeto pequeno, mas ja pensou quando o mesmo for expandido e ficar maior? varias alteracoes e caso uma coluna de atributo ou entidade seja alterado posteriormente, isso vai gerar bastante retrabalho.

Como funciona?
imagine o seguinte cenario abaixo, onde estamos construindo um sistema do aluno

`@Entity
@Table(name = "estudante")
public class Student {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Column(name = "grad_year")
private int gradYear;
Enter fullscreen mode Exit fullscreen mode

}`

Em seguida, precisamos gerar as classes de metamodelo e, para isso, usaremos a ferramenta geradora de metamodelo fornecida pelo JBoss, existem outras tais como EclipseLink, OpenJPA ..

para usar a ferramenta necessitamos adicionar ao pomxml a seguinte dependencia

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
</dependency>

Com base na especificação JPA, uma classe gerada residirá no mesmo pacote que a classe de entidade correspondente e terá o mesmo nome com um “_” conforme abaixo

`@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Student.class)
public abstract class Student_ {

public static volatile SingularAttribute<Student, String> firstName;
public static volatile SingularAttribute<Student, String> lastName;
public static volatile SingularAttribute<Student, Integer> id;
public static volatile SingularAttribute<Student, Integer> gradYear;

public static final String FIRST_NAME = "firstName";
public static final String LAST_NAME = "lastName";
public static final String ID = "id";
public static final String GRAD_YEAR = "gradYear";
Enter fullscreen mode Exit fullscreen mode

}`

Sendo assim fica facil, e so substituir em suas buscar com criterios para o metamodelo estático

Como gerar metamodel no Intellij?

Em configuracao, va ate a aba Compiler ou compilador, localize o Annotation Processors , ative o processamento de anotação e selecione obter do caminho de classe do projeto. Adicione o nome do processador de anotação org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor (e opcionalmente as opções do processador de anotação). Selecione o(s) módulo(s) que contém suas entidades no caso suas Classes, Se você configurou o Maven conforme recomendado, é melhor selecionar o mesmo diretório de saída para as classes geradas. Por padrao, é a pasta target/generated-sources/apt .

Bem espero ter Ajudado ate a proxima 👨‍💻
forma, as classIntelliJ Idea.

Top comments (0)