Consultas de criterios ou "criteria" usando o metamodelo
Tags: spring, springjpa, java, beginners
Published: 2022-11-20 20:09:31

**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;

    
}`

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";
}`

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.