Mapeamento de query nativa para objeto
Foi criado uma anotação chamada DTOValueAsColumn, essa anotação tem como função anotar métodos e atributos com nomes de colunas de uma query;
Nessa anotação tem um atributo chamado “name” que deve receber o nome da coluna, caso não seja informado ele pega o nome do atributo ou do método para ser o nome da coluna da consulta;
Não precisa se preocupar com o cast, pois ao converter a consulta para o objeto é realizado tudo automaticamente. Inclusive é realizado cast de enum, caso o atributo ou parametro seja um enum, o dado trazido na consulta deve ser um inteiro para realizar o cast com base no ordinal do enum, ou uma string, para realizar o cast com base no name do enum;
Quando for um método anotado, o mesmo deve ter apenas um parâmetro. E se o método tiver “set”, o mesmo é removido para pegar o nome da coluna;
Exemplos de uso:
//Atributo, usando o name da anotação para ser o nome da coluna
DTOValueAsColumnSQL(name = "NOME")
private String nome;
//Atributo, sem usar o name da anotação, usa o nome do atributo como nome da coluna
DTOValueAsColumnSQL
private String nome;
//Método, usando o name da anotação para ser o nome da coluna
//Métodos anotados devem conter apenas um parâmetro
DTOValueAsColumnSQL(name = "NOME")
public void setNome(String nome) {
this.nome = nome;
}
Visto que em alguns caso ocorre divergência entre os tidos de dados trazidos pela consulta quando executada em Oracle e executada em Firebird. Foi pensado nisso que foi adicionado que o mapeamento seja feito por métodos, assim pode executar um cast especifico sem problemas. Exemplo:
No Firebird os campos Integer são retornados como Integer para o java, mas no oracle em alguns casos os campos Integer são retornados como BigDecimal, ai se faz necessário o uso de um cast mais especifico, como é no exemplo acima.
Convertendo query nativa para objeto
Para converter a query é simples, deve ser utilizada a classe QueryMappingUtil, nessa classe tem dois métodos estáticos:
<T> Optional<T> getObjectDTO(Query query, Class<T> tClass):
Esse método executa a query, e retorna apenas o primeiro registro convertido para objeto da classe passada como parâmetro “tClass”. Caso não retorne nenhum registro o mesmo retorna um Optiona.empty();
<T> List<T> getListDTO(Query query, Class<T> tClass):
Esse método executa a query, a cada registro que é encontrado na consulta, o mesmo é convertido para objeto da classe que foi passada como parâmetro “tClass”, e adiciona na lista para retorno, por algum problema que ocorra na conversão e retorne um objeto nulo, o mesmo não deve ser adicionado na lista;
Observação: Garantir que todos os tipos de dados dos campos estejam corretos, o sistema não para o mapeamento caso ocorra um erro no cast, o mesmo somente pula a coluna e vai para a próxima, mas exibe no log, qual foi a coluna e método/atributo da classe que deu problema na conversão;
Exemplo de uso
SQL:
Classe DTO:
Repositório: