Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current Restore this Version View Page History

Version 1 Current »

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;
}
//Método, sem usar o name da anotação, usa o nome do método como nome da coluna
//caso o nome do método contenha "set", o mesmo é removido
//Métodos anotados devem conter apenas um parâmetro
DTOValueAsColumnSQL
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:

private Integer ID;

@DTOValueAsColumnSQL(name = "ID")
public void setID(Object ID) {
  if (ID instanceof Integer)
    this.ID = (Integer) ID;
  else if (ID instanceof BigDecimal)
    this.ID = ((BigDecimal) ID).intValue();
}

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:

SELECT NUMERCM,
       NOME
  FROM CONTAMOV

Classe DTO:

class ContaMovDTO {
  DTOValueAsColumnSQL(name = "NUMEROCM")
  Integer numeroCM;
  DTOValueAsColumnSQL(name = "NOME")
  String nome;
}

Repositório:

public List<ContaMovDTO> getAll() {
  Query query = entityManager.createNativeQuery(//sql exemplo);
  
  return QueryMappingUtil.getListDTO(query, ContaMovDTO.class);
}