Crianado um Método para calcular a Idade a partir da data de Nascimeneto cadastrada no banco

Olá Pessoa! Saudações extensivas a todos os membros. Sou novo no grupo e desde já parabenizar a comunidade pós tem ajudado muita gente(em especial EU) com suas informações dispostas pelos membros.
Gostaria da ajuda da comunidade para aqueles que têm conhecimento de Java Web com Jsf e Hibernate.
Estou tentando implementar um método para calcular a faixa etário dos meus clientes e agrupar em Infantil, Jovens e Adultos; No modelo já tenho a data de Nascimento registrada.
Alguém poderia me ajudar. por favor toda a ideia é válida para o meu conhecimento e aprendizado.

@Pedro21
bom dia, eu tenho dois métodos que uso para calcular a idade, mas para separar clientes em grupos usando faixa etária, vai depender onde você quer implementar esse método e para qual finalidade. Fiz a mesma coisa para um relatório, mas dentro da minha consulta SQL.

Segue os métodos com teste:

/**
     * 30a 08m 21d
     *
     * @param dataNascimento
     * @return
     */
    public static String calcularIdade(LocalDate dataNascimento) {
        try {
            Period p = dataNascimento.until(LocalDate.now());
            return doisDigitos(p.getYears()) + "a " + doisDigitos(p.getMonths()) + "m " + doisDigitos(p.getDays()) + "d";
        } catch (Exception e) {
            return "";
        }
    }

    /**
     * Transforma um integer em uma string de dois digitos. Ex: 1 para 01
     *
     * @param valor
     * @return
     */
    public static String doisDigitos(int valor) {
        return valor < 10 ? "0" + valor : String.valueOf(valor);
    }

    /**
     * Infantil, Jovens e Adultos
     *
     * @param dataNascimento
     * @return
     */
    public static String getFaixaEtaria(LocalDate dataNascimento) {
        try {
            Period p = dataNascimento.until(LocalDate.now());
            if (p.getYears() < 16) {
                return "Infantil";
            } else if (p.getYears() <= 18) {
                return "Jovem";
            } else {
                return "Adulto";
            }
        } catch (Exception e) {
            return "";
        }
    }

@ Villagram.
Bom dia Villagram, desde já agradeço pela atenção e pelo contributo mano.
De certeza que me vão sim ajudar para solucionar o meu trabalho.

Dizer que o método pretendo implementar no DAO onde filtro todos os clientes activos, e de segida pretendo trazer estes resultados num gráfico para poder organiza-los em grupos.
É possivel fazer tudos isto no DAO usando criteria ou SQL nactiva e simplesmente chamar as variáveis no método que implementa os gráficos?

E se sim gostaria mais uma vez da tua ajuda.
Obrigado.

@Pedro21
Se você vai injetar os dados no gráfico via código é mais rápido e fácil usar os métodos que passei, pois para fazer isso diretamente no SQL você vai precisar tratar linha a linha durante a consulta ao banco de dados, esse tipo de tratamento é muito custoso para o banco de dados. Existindo uma forma de fazer o tratamento de dados sem fazer isso em consultas SQL é a melhor prática pensando em agilidade e consumo de recursos.

1 curtida

Mui grato Villagram pela excelente explicação. Deu-me um conjunto de hipótese para poder resolver e estou já implementando e estudando melhor baseando-se nos métodos que por ti foram passados. Assim que conseguir publico a solução para que outros possam analisar também.

Geralmente o que eu faço é criar uma classe modelo colocando as informações que não existem no banco e depois uso um loop para preenche-los.

public void test(ResultSet resultSet) throws Exception {
        List<GraficoFaixaEtaria> list = new ArrayList();
        while (resultSet.next()) {
            list.add(new GraficoFaixaEtaria(
                    resultSet.getString(0),
                    resultSet.getDate(1),
                    getFaixaEtaria(resultSet.getDate(1))
            ));
        }
    }

    public static String getFaixaEtaria(Date dataNascimento) {
        try {
            Period p = ZonedDateTime.ofInstant(dataNascimento.toInstant(), ZoneId.systemDefault()).toLocalDate().until(LocalDate.now());
            if (p.getYears() < 16) {
                return "Infantil";
            } else if (p.getYears() <= 18) {
                return "Jovem";
            } else {
                return "Adulto";
            }
        } catch (Exception e) {
            return "";
        }
    }

    @Data
    @AllArgsConstructor
    public class GraficoFaixaEtaria {

        private String cliente;
        private Date nascimento;
        private String faixaEtaria;

    }
1 curtida