Return to Video

JAD CAP03 2024 VA08 CONSULTAS DERIVADAS DE METODO

  • 0:08 - 0:10
    Além da JPQL,
    também podemos construir
  • 0:10 - 0:13
    as consultas através
    de uma outra forma
  • 0:13 - 0:16
    que chamamos
    de consultas baseadas em métodos.
  • 0:16 - 0:21
    Ou seja, conseguimos utilizar
    os nomes dos campos
  • 0:21 - 0:26
    que temos lá na classe Java,
    como parte do nome da função.
  • 0:26 - 0:30
    E claro, temos que seguir algumas
    regras para conseguir fazer isso.
  • 0:30 - 0:33
    Então, o nome do método
    que vamos criar
  • 0:33 - 0:38
    é o que vai determinar
    que tipo de consulta a JPA vai fazer.
  • 0:38 - 0:42
    Então, chamamos isso
    de consultas derivadas de métodos.
  • 0:42 - 0:45
    Beleza?
    Então vamos usar um nome
  • 0:45 - 0:48
    que é padronizado,
    vamos utilizar algumas palavras
  • 0:48 - 0:52
    que a JPA nos indica.
  • 0:52 - 0:55
    E aí, com base nos nomes
    dos atributos da nossa classe,
  • 0:55 - 0:58
    conseguimos fazer a consulta,
    beleza?
  • 0:58 - 1:00
    Vamos dar uma olhada
    nessa documentação
  • 1:00 - 1:02
    para entendermos melhor
    o que isso quer dizer.
  • 1:02 - 1:03
    Vamos lá.
  • 1:03 - 1:09
    Estou aqui na documentação
    desses métodos,
  • 1:09 - 1:13
    nessas consultas baseadas em métodos.
  • 1:13 - 1:17
    Então, o que acontece?
    Olha só, as pesquisas que vamos usar,
  • 1:17 - 1:22
    a forma que vamos escrever os métodos,
    os nomes dos métodos
  • 1:22 - 1:23
    para poder fazer as pesquisas.
  • 1:23 - 1:27
    E aí temos aqui o padrão, tá?
    Então, por exemplo,
  • 1:27 - 1:29
    Temos aqui,
    olha nessa tabela
  • 1:29 - 1:34
    a palavra chave que vamos usar
    e temos aqui um exemplo
  • 1:34 - 1:38
    de como ficaria o nome do método.
  • 1:38 - 1:41
    Então, por exemplo,
    temos aqui olha, o "And".
  • 1:41 - 1:44
    Então o "And" usamos para fazer
    aquelas pesquisas,
  • 1:44 - 1:47
    onde combinamos dois campos,
    por exemplo,
  • 1:47 - 1:53
    selecionar listagem de uma tabela,
    todos os registros onde
  • 1:53 - 1:56
    a cidade seja,
    por exemplo, São Paulo
  • 1:56 - 2:01
    e o nome do bairro,
    seja, por exemplo, Vila Mariana.
  • 2:01 - 2:05
    Então usamos dois ou mais atributos
    para fazer a consulta.
  • 2:05 - 2:08
    Então olha só,
    como que fica essa consulta?
  • 2:08 - 2:13
    É "findBy",
    esse "findBy" ele é obrigatório.
  • 2:13 - 2:17
    Esse "Lastname"
    Ele é o nome de um atributo na classe.
  • 2:17 - 2:21
    Então imagina que você tem lá
    uma classe Java e lá tem um atributo
  • 2:21 - 2:22
    chamado "Lastname".
  • 2:22 - 2:26
    E tem um outro atributo
    chamado "Firstname".
  • 2:26 - 2:29
    Então o "Lastname"
    e o "Firstname"
  • 2:29 - 2:33
    eles são os nomes
    dos atributos na classe.
  • 2:33 - 2:38
    Agora, o "findBy" é o nome
    de um método padronizado pela JPA.
  • 2:38 - 2:40
    Eu tenho que usar esse "findBy".
  • 2:40 - 2:47
    Então imagina que ao invés do nome
    em inglês, fosse em português,
  • 2:47 - 2:48
    último nome e o primeiro nome.
  • 2:48 - 2:50
    Ficaria como?
  • 2:50 - 2:55
    "findBy", ultimo nome, "and",
    primeiro nome.
  • 2:55 - 2:58
    Um outro exemplo.
    Olha só o "Between" aqui.
  • 2:58 - 3:01
    O "Between", "findBy",
    ai tem aqui ó,
  • 3:01 - 3:06
    a data inicial "Between", né?
  • 3:06 - 3:09
    Então vamos fazer ali uma busca, né?
  • 3:09 - 3:14
    Encontrar pela data inicial,
    que esteja entre,
  • 3:14 - 3:18
    e aí passaremos as duas datas
    que serão fornecidas para esse método.
  • 3:18 - 3:21
    Legal.
    O "LessThan", por exemplo.
  • 3:21 - 3:24
    Eu quero buscar todo mundo,
    todos os registros
  • 3:24 - 3:27
    onde um determinado campo
    seja menor que alguma coisa.
  • 3:27 - 3:30
    Olha só.
    "findBy", "Age".
  • 3:30 - 3:34
    Esse "Age" ele é o nome
    do atributo lá na classe,
  • 3:34 - 3:36
    vamos supor que fosse idade,
    em português,
  • 3:36 - 3:40
    então ficaria "findBy",
    idade, "LessThan".
  • 3:40 - 3:44
    Então o nome dessa palavra
    aqui no meio,
  • 3:44 - 3:47
    ela tem que ser o nome do atributo
    lá na classe.
  • 3:47 - 3:51
    Só que o "findBy" eu tenho que usar
    e o "LessThan" também.
  • 3:51 - 3:54
    Ou seja,
    a JPA vai entender que tipo
  • 3:54 - 3:59
    de consulta queremos implementar,
    por conta dessas palavras aqui,
  • 3:59 - 4:02
    dessas expressões aqui, beleza?
  • 4:02 - 4:03
    E aí eu recomendo pra vocês.
  • 4:03 - 4:08
    Vocês tem um link dessa documentação
    no material escrito,
  • 4:08 - 4:11
    então eu recomendo que vocês
    olhem essa documentação
  • 4:11 - 4:15
    para poder variar
    bastante aqui as consultas de vocês.
  • 4:15 - 4:18
    Olha quanta coisa temos aqui.
  • 4:18 - 4:20
    Tá bom?
    Então vamos fazer alguns testes
  • 4:20 - 4:22
    para ver como que isso aqui funciona.
  • 4:22 - 4:26
    Bom, então vocês viram que tem ali
    todo uma padronização?
  • 4:26 - 4:30
    Então teremos aquelas palavras
    que são obrigatórias,
  • 4:30 - 4:35
    "findBy", "And",
    "LessThan","Between".
  • 4:35 - 4:39
    Essas palavras irão compor
    o nome da função e você vai combinar
  • 4:39 - 4:43
    com os nomes dos campos
    no objeto Java, na classe Java.
  • 4:43 - 4:46
    Isso conseguiremos fazer.
  • 4:46 - 4:49
    Dessa forma, conseguiremos fazer
    as consultas baseados
  • 4:49 - 4:51
    no nome dos métodos.
  • 4:51 - 4:52
    Olha que legal, né?
  • 4:52 - 4:56
    Essa é uma técnica bastante
    interessante que a JPA entrega para nós.
  • 4:56 - 5:00
    Vamos criar ali uma consulta,
    por exemplo,
  • 5:00 - 5:03
    para fazer uma busca pelo nome,
  • 5:03 - 5:06
    só que usando o método,
  • 5:06 - 5:10
    o nome do método
    e não usando a Query, usando a JPQL.
  • 5:10 - 5:13
    Então vamos fazer um ajuste
    ali nas nossas consultas
  • 5:13 - 5:15
    para vermos como isso ai funciona.
  • 5:15 - 5:19
    Vamos lá, ver como que fica isso
    escrito em código
  • 5:19 - 5:21
    mesmo ali na nossa aplicaçao.
  • 5:21 - 5:22
    Vamos trabalhar um pouco.
  • 5:22 - 5:27
    Então olha só, temos aqui
    esse "BuscarContatoPeloNome, né?
  • 5:27 - 5:31
    Então temos já aqui uma consulta
    usando a JPQL,
  • 5:31 - 5:34
    para fazer uma busca de contato
    pelo nome.
  • 5:34 - 5:36
    Agora imagina que queriamos
    fazer isso,
  • 5:36 - 5:42
    só que usando a consulta
    derivada de método.
  • 5:42 - 5:43
    Então como vamos fazer, né?
  • 5:43 - 5:46
    Então eu vou fazer aqui mesmo,
    aqui embaixo,
  • 5:46 - 5:48
    para vermos como que elas são similares.
  • 5:48 - 5:50
    Tá bom?
    Então vamos lá.
  • 5:50 - 5:51
    Eu vou colocar aqui,
    olha,
  • 5:51 - 5:57
    vou criar aqui
    um "Optional"
  • 5:57 - 5:59
    Então o que essa função vai retornar?
  • 5:59 - 6:02
    Ela vai retornar o objeto "Optional"
    do tipo "Contato".
  • 6:02 - 6:05
    Ela vai carregar um contato dentro dela.
  • 6:05 - 6:08
    E aí, seguindo aquela regra,
  • 6:08 - 6:10
    como que vai ficar aqui
    o nome da consulta?
  • 6:10 - 6:13
    Eu sei que o meu campo
    lá no banco de dados.
  • 6:13 - 6:16
    Na verdade, no banco de dados não,
    na classe, né?
  • 6:16 - 6:18
    Ela é, onde está nossa
    classe Java?
  • 6:18 - 6:22
    Deixa eu abrir aqui.
    Olha só, é nome, tá?
  • 6:22 - 6:25
    E está em português inclusive, né?
    Bacana.
  • 6:25 - 6:27
    Então como ficará aqui, olha.
  • 6:27 - 6:32
    "findBy".
    Então esse "findBy" é obrigatório.
  • 6:32 - 6:36
    Isso aqui a JPA vai reconhecer
    como sendo uma pesquisa,
  • 6:36 - 6:39
    uma consulta que ela vai ter
    que construir.
  • 6:39 - 6:42
    "findBy" o quê?
    Nome.
  • 6:42 - 6:47
    E observa que eu coloquei o nome
    aqui, com N maiúsculo,
  • 6:47 - 6:50
    apesar de aqui estar com ele minúsculo.
  • 6:50 - 6:54
    Mas a JPA também
    entende o que é meu case aqui.
  • 6:54 - 6:58
    Então ele sabe que esse "findBy"
    é dela da JPA,
  • 6:58 - 7:03
    e ele vai saber que o nome apesar
    de estar com letra maiúscula,
  • 7:03 - 7:06
    ele sabe que está com letra maiúscula
    por conta do que é meu case.
  • 7:06 - 7:09
    E aí vamos colocar aqui, né?
  • 7:09 - 7:12
    Qual é o valor que deve ser passado
  • 7:12 - 7:15
    para que essa consulta possa acontecer?
  • 7:15 - 7:19
    Tá bom?
    Então essa vai ser a anatomia aqui,
  • 7:19 - 7:23
    a assinatura da classe
    que teremos que criar.
  • 7:23 - 7:25
    E olha só.
    Olha como é simples,
  • 7:25 - 7:30
    não precisaremos
    nem escrever aqui a JPQL.
  • 7:30 - 7:35
    Então se você precisar fazer uma consulta
    e encontrar alguma coisa
  • 7:35 - 7:41
    que vai usar apenas um parâmetro,
    apenas um campo,
  • 7:41 - 7:44
    apenas uma propriedade do objeto,
  • 7:44 - 7:48
    então você faz dessa forma, você
    não precisa usar a JPQL.
  • 7:48 - 7:49
    Tá bom?
    Legal.
  • 7:49 - 7:56
    Agora vamos construir um service
    e vamos usar esse método aqui,
  • 7:56 - 8:01
    é baseado em Map, essa consulta
    baseada em nome de Map.
  • 8:01 - 8:04
    Então, vamos lá agora
    para o nosso servço, né?
  • 8:04 - 8:07
    E iremos fazer essa consulta aqui.
  • 8:07 - 8:09
    Eu estou pensando
    até em fazer o seguinte,
  • 8:09 - 8:12
    ao invés de fazer pelo nome,
    eu vou fazer pelo email,
  • 8:12 - 8:14
    porque temos um email lá.
  • 8:14 - 8:17
    Eu acho que vai ficar mais legal
    porque vamos ter uma pelo nome
  • 8:17 - 8:21
    usando aqui na JPQL
    e vamos ter uma por email, tá?
  • 8:21 - 8:24
    Eu vou fazer assim,
    para termos até essa consulta
  • 8:24 - 8:26
    disponível aqui no nosso endpoint.
  • 8:26 - 8:27
    Então vamos lá.
  • 8:27 - 8:31
    Então eu mudei aqui,
    eu vou retornar um "Optional"
  • 8:31 - 8:34
    só que eu vou buscar o contato pelo email.
  • 8:34 - 8:37
    Então vai ser fornecido o email
    para localizarmos o contato
  • 8:37 - 8:39
    na nossa base de dados.
  • 8:39 - 8:43
    Agora ficou legal.
    Agora vamos criar lá no nosso service,
  • 8:43 - 8:47
    um método para fazer isso,
    para consumir esse serviço.
  • 8:47 - 8:50
    Vamos chamar aqui um "public",
    vamos ter também.
  • 8:50 - 8:57
    Ele vai retornar o que?
    O "ContatoExibicaoDto".
  • 8:57 - 9:03
    Vamos chamar
    de "buscarContatoPeloEmail".
  • 9:03 - 9:06
    Usando um nome em português mesmo,
    aqui não tem problema.
  • 9:06 - 9:10
    Onde temos que usar
    o "findBy" é no repositório,
  • 9:10 - 9:12
    lá no serviço não tem
    problema nenhum,
  • 9:12 - 9:15
    eu posso usar
    o nome que eu quiser, tá?
  • 9:15 - 9:17
    E vamos passar, né?
  • 9:17 - 9:20
    Quem chamar esse método
    vai ter que me passar
  • 9:20 - 9:23
    uma string que vai representar
    o meu email.
  • 9:23 - 9:29
    E aí vamos retornar
    o "repository."
  • 9:29 - 9:31
    E temos ali olha,
    o "findByEmail"
  • 9:31 - 9:35
    que é essa última função
    que criamos no nosso serviço.
  • 9:35 - 9:40
    Vamos fornecer esse email aqui,
    para quem chamar.
  • 9:40 - 9:45
    E lógico, aqui estamos falando
    que ele vai retornar
  • 9:45 - 9:48
    o "ContatoExibicaoDto".
  • 9:48 - 9:52
    Só que lembra que o "findByEmail"
    ele vai retornar para nós
  • 9:52 - 9:54
    um "Optional".
  • 9:54 - 9:57
    Então, na verdade aqui,
    o que vamos fazer, né?
  • 9:57 - 10:05
    Vamos criar aqui
    o "Optional" do tipo contato.
  • 10:05 - 10:08
    Vamos chamar esse cara aqui
    de "contatoOptional".
  • 10:08 - 10:14
    E vai receber o quê?
    A resposta do nosso repositório, né?
  • 10:14 - 10:15
    Então esse cara aqui,
  • 10:15 - 10:20
    vai retornar
    para nós um objeto do tipo "Optional".
  • 10:20 - 10:24
    E aí, o que vamos fazer?
    Vamos extrair esse contato
  • 10:24 - 10:27
    de dentro do objeto
    "Optional".
  • 10:27 - 10:29
    Então vamos verificar aqui,
    se o "contatoOptional".
  • 10:29 - 10:35
    Nesse "contatoOptional.isPresent",
    ou seja,
  • 10:35 - 10:38
    se tem um contato presente
    nesse objeto, "contatoOptional",
  • 10:38 - 10:40
    o que faremos?
  • 10:40 - 10:44
    Vamos retornar um "new"
    "ContatoExibicaoDto",
  • 10:44 - 10:50
    passando esse
    "contatoOptional.get.
  • 10:50 - 10:51
    Bacana.
    Aí lembra,
  • 10:51 - 10:56
    que o nosso "ContatoExibicaoDto"
    ele tem um construtor que recebe
  • 10:56 - 11:02
    o contato e retorna a instância
    de um objeto "ContatoExibicaoDto".
  • 11:02 - 11:03
    Legal?
    E esse "get",
  • 11:03 - 11:06
    ele está extraindo o objeto contato
  • 11:06 - 11:08
    que está dentro
    desse "contatoOptional"
  • 11:08 - 11:09
    Legal, né?
  • 11:09 - 11:13
    E caso ele não encontre,
    pode ser que tenha fornecido um email
  • 11:13 - 11:18
    que não existe o email errado,
    então vamos lançar uma exceção
  • 11:18 - 11:21
    para dizer que esse esse usuário
    esse contato
  • 11:21 - 11:24
    que está sendo buscado
    ele não existe.
  • 11:24 - 11:26
    Então,
    "UsuárioNaoEncontradoException"
  • 11:26 - 11:35
    vou passar aqui a frase,
    "contato não encontrado"
  • 11:35 - 11:36
    e vamos finalizar aqui.
  • 11:36 - 11:38
    então pronto,
    nosso serviço está aqui.
  • 11:38 - 11:41
    Então vou
    "buscarContatoPeloEmail".
  • 11:41 - 11:45
    Ele precisa receber um email, né?
  • 11:45 - 11:47
    Ele vai retornar
    o "ContatoExibicaoDto",
  • 11:47 - 11:51
    só que o nosso "findByEmail"
    ele retorna
  • 11:51 - 11:55
    um "contatoOptional",
    então colocamos aqui,
  • 11:55 - 11:58
    criamos um contato,
    um objeto do tipo optional,
  • 11:58 - 12:01
    do tipo contato,
    não carregando um contato
  • 12:01 - 12:03
    e vamos verificar
    se existe esse contato.
  • 12:03 - 12:08
    Se ele estiver presente,
    retornamos o "ContatoExibicaoDto".
  • 12:08 - 12:11
    Extraímos o contato que está dentro
    do optional
  • 12:11 - 12:14
    para poder construir esse objeto,
    "ContatoExibicaoDto".
  • 12:14 - 12:18
    Se não lançamos aqui uma exceção
    do tipo usuário não encontrado
  • 12:18 - 12:22
    Agora precisamos criar
    o endpoint.
  • 12:22 - 12:27
    Então vamos chegar no nosso controlador
    e vamos criar esse endpoint.
  • 12:27 - 12:28
    Então vamos lá.
  • 12:28 - 12:34
    Então vai ser que um
    "@GetMapping"
  • 12:34 - 12:36
    e eu vou usar também
    parâmetro aqui.
  • 12:36 - 12:42
    Então vamos chamar aqui
    um "@GetMapping",
  • 12:42 - 12:46
    vamos passar um parâmetro
    que vai ser o email, tá?
  • 12:46 - 12:49
    Então essa consulta
    ela vai ficar desse jeito aqui.
  • 12:49 - 12:53
    Vai ficar "api/contatos",
  • 12:53 - 12:58
    passando o parâmetro Query string
    aqui email que vai ser igual,
  • 12:58 - 13:02
    porque aí você vai colocar aqui
    o email que você está querendo
  • 13:02 - 13:04
    consultar no banco.
  • 13:04 - 13:05
    Beleza, bacana.
  • 13:05 - 13:09
    Então vamos agora fazer aqui
    o nosso método,
  • 13:09 - 13:13
    Então esse "public" vai retornar
    o "ContatoExibicaoDto"
  • 13:13 - 13:17
    quando "bucarContatoPeloEmail",
  • 13:17 - 13:21
    nome da nossa função,
    do nosso método.
  • 13:21 - 13:24
    Quem chamar
    o "buscarContatoPeloEmail",
  • 13:24 - 13:29
    terá que passar o email
    e esse email
  • 13:29 - 13:32
    virá aqui pelo parâmetro da URL.
  • 13:32 - 13:38
    Então teremos aqui
    um "@RequestParam".
  • 13:38 - 13:44
    E quem é esse parâmetro?
    Vamos usar aqui.
  • 13:44 - 13:47
    Então o parâmetro que tá vindo aqui,
    que é o email,
  • 13:47 - 13:50
    será colocado no valor da variável
    do argumento email
  • 13:50 - 13:53
    da função "buscarContatoPeloEmail".
  • 13:53 - 13:56
    E a implementação será simplesmente
  • 13:56 - 14:02
    um "return service.buscarContatoPeloEmail",
  • 14:02 - 14:07
    passando esse email que foi
    enviado para nós
  • 14:07 - 14:10
    que envia parâmetro na URL.
  • 14:10 - 14:10
    Então olha lá.
  • 14:10 - 14:18
    Será uma pesquisa então
    será uma requisição HTTP do tipo GET
  • 14:18 - 14:20
    Qual vai ser a requisição?
  • 14:20 - 14:23
    "/contatos",
    completando lá o "/api/contatos"
  • 14:23 - 14:25
    e vai ter um parâmetro email.
  • 14:25 - 14:29
    Carregando o email do contato
    que está sendo buscado.
  • 14:29 - 14:36
    Esse email que será fornecido aqui,
    vamos substituir aqui
  • 14:36 - 14:38
    no argumento aqui
    da nossa função, tá bom?
  • 14:38 - 14:41
    E aí vamos passar isso
    lá para o nosso serviço
  • 14:41 - 14:45
    e ele vai retornar se encontrar
    o email equivalente lá.
  • 14:45 - 14:57
    Então vamos restartar nossa aplicação
    para fazermos essa consulta .
  • 14:57 - 14:58
    Pronto!
  • 14:58 - 15:00
    Então olha,
    ela foi exportada com sucesso,
  • 15:00 - 15:02
    não tivemos nenhum problema.
  • 15:02 - 15:05
    Então agora vamos fazer
    uma consulta por email.
  • 15:05 - 15:08
    Então vamos lá.
    Então eu vou pegar aqui.
  • 15:08 - 15:11
    Eu não tenho uma consulta pelo email.
  • 15:11 - 15:13
    Então vou pegar essa consulta
    aqui pelo nome.
  • 15:13 - 15:15
    Eu vou duplicar ela.
  • 15:15 - 15:20
    Vou dar o nome aqui,
    "buscar pelo email".
  • 15:20 - 15:22
    "Create".
    Vou clicar nela.
  • 15:22 - 15:24
    E vamos arrumar aqui
    essa URL.
  • 15:24 - 15:26
    Essa URL não será assim não.
  • 15:26 - 15:29
    Vou chamar aqui,
    "/contatos,
  • 15:29 - 15:36
    como vamos usar parâmetros,
    vamos colocar aqui "?email="
  • 15:36 - 15:39
    e eu vou colocar o email da pessoa
    que estou buscando.
  • 15:39 - 15:41
    Então eu não me lembro
    dos emails cadastrados,
  • 15:41 - 15:43
    então vou pedir para listar
    todo mundo aqui.
  • 15:43 - 15:46
    Vamos supor que eu quero procurar
    alguém
  • 15:46 - 15:49
    que tem um email,
    "joao@email.com".
  • 15:49 - 15:53
    É o registro número 8.
    Deixa eu dar um "control+c" aqui.
  • 15:53 - 15:56
    Vamos dar uma olhada.
    "control+v" aqui.
  • 15:56 - 16:00
    Então olha só,
    eu vou fazer uma busca nesse servidor
  • 16:00 - 16:03
    na porta 8080,
    nesse recurso eu quero
  • 16:03 - 16:07
    o contatos e vou passar aqui
    o parâmetro email
  • 16:07 - 16:10
    e o valor desse parâmetro é
    "joao@email.com".
  • 16:10 - 16:13
    Vamos dar um "Send".
    Vamos ver se vai achar.
  • 16:13 - 16:16
    Olha lá,
    achou aqui o contato,
  • 16:16 - 16:19
    se eu pegar aqui por exemplo,
    um ponto BR.
  • 16:19 - 16:22
    Esse email não existe.
    Então se eu der um "Send".
  • 16:22 - 16:25
    Ele não achou,
    deu "404 Not Found".
  • 16:25 - 16:29
    Ou seja,
    esse recurso que você está buscando
  • 16:29 - 16:33
    lá no servidor
    não tem, não está lá.
  • 16:33 - 16:34
    Então é isso.
  • 16:34 - 16:37
    Agora a gente também
    sabe como utilizar as consultas
  • 16:37 - 16:40
    utilizando ali
    as consultas derivadas de método.
  • 16:40 - 16:44
    Então você pode utilizar aquelas palavras
    chave naquelas keyword
  • 16:44 - 16:49
    que você tem
    ali na documentação da tabela. JPG
  • 16:49 - 16:54
    para construir as suas consultas baseadas
    no nome do método ali no repositório.
  • 16:54 - 16:57
    E aí você faz uma combinação
    das kill words
  • 16:57 - 17:02
    com os nomes dos campos
    que você tem lá na sua classe Java.
  • 17:02 - 17:05
    Então isso vai permitir que você crie
    também aí
  • 17:05 - 17:08
    consultas personalizadas
    de uma forma bastante simples.
Title:
JAD CAP03 2024 VA08 CONSULTAS DERIVADAS DE METODO
Video Language:
Portuguese, Brazilian
Duration:
17:12

Portuguese, Brazilian subtitles

Incomplete

Revisions Compare revisions