Estou tentando fazer um teste unitário mas o Sonar reclama de não cobrir as linhas de código dentro do lambda em ToSpec. Alguma ideia de como eu faço para cobrir isso? No caso Path até return ficam como not covered
Fazer paginação e ordenação por meio do Pageable é muito simples na maioria dos casos, dificuldade começar aumentar quando precisa ordenar por uma coluna de tabela oriunda de JOINs. Agora Alberto me chamou muito atenção essa consulta que desconhecia ser possível: @Query("SELECT u FROM Usuario u WHERE u.nome= :#{#busca.nome}")
A possibilidade de passar um objeto como parâmetro na assinatura do método e na montagem da consulta ir acessando suas propriedades. Sabe informar se esse recurso pertence nativamente a especificação da JPA/JPQL?
Fala, Alberto. Falando sobre DDD, a paginação seria feito em nosso application service? Se sim, não ia rolar usar todos esses detalhes de infra, né!? Será que rola um vídeo mais detalhado respeito? 🤩
Oi Vinícius, eu preciso admitir para você que faz um tempo que deixei de lado essas práticas. Acho o livro do ddd ótimo, mas peguei o que achei legal, juntei com o lance da carga cognitiva que falo e tentei achar um estilo de design adequado as aplicações que desenvolvo e facilito.
Oi Ricardo, rola sim. Apenas vai rolar um esforço a mais por conta de todo código necessário na Criteria para que você monte um group by. Se fizer, depois responde aqui :).
Opa, acho que não muda muito. Você vai receber os parâmetros da paginação, realizar a query e devolver o que precisa. Me perdoe se eu não tiver entendido corretamente.
@@DevEficiente eu até consegui fazer esse método do vídeo, porém tem um problema, ele fica duplicando os registros da tabela. Por exemplo se tem 3 registros com o mesmo ID ele retorna os 3, porém só com os dados do primeiro. Você sabe como resolver isso? Visto que é uma tabela que pode ter ids iguais desde que o id de centro custo seja diferente em cada registro igual. Utilizando Factory esse erro não acontece.
Eu achei legal a tentativa do Spring de tipar as consultas com a Criteria API, mas no geral... acho que o código fica muito verboso. Com um filtro simples no seu exemplo, foi necessário usar 7 linhas. Espero que eles melhorem isso com as expressões lambda, assim como o C# faz com o Entity Framework.
Ferrou hehe. O linq é um construção inimaginável para o Java. O c# tem uma funcionalidade que permite você manipular a ast do código e que dá um poder bem louco para construir dsl. Tem iniciativas tipo jooq e outras que usam metamodel, mas confesso que não acho o ganho tão legal.
Ah, também é claro que dá para criar wrappers sobre o criteria, através de proxies dinâmicos ou coisas menos sofisticadas. Mas admito que não vejo um resultado final tão legal. O melhor era poder concatenar um pedaço de jpql e tava tudo certo hehe
4 года назад
Parabéns Alberto! Conteúdo muito bom e claro!! Só uma curiosidade, você já usou a abstração criada com kotlin "implementation("au.com.console:kotlin-jpa-specification-dsl:2.0.0-rc.1")"? Ela deixa o código da specification bem simples com as extensions functions do kotlin: import au.com.console.jpaspecificationdsl.equal import br.com.joelamalio.invoicemanagement.domain.entities.Invoice import org.springframework.data.jpa.domain.Specificationimport java.time.LocalDate object InvoiceSpecification { fun equal(dueDate: LocalDate?): Specification = Invoice::dueDate.equal(dueDate) }
Para saber mais sobre a Jornada Dev Eficiente acesse deveficiente.com/
Gostei muito da sua maneira de explicar. O conhecimento foi muito útil para o meu cenário (:
Massa que curtiu!!!
Desse jeito eu nunca tinha visto, e foi bem no momento que tava precisando. valeu.
Bom demais que ajudou!
Meu amigo, muito obrigado por compartilhar este conheceimento. Parabéns pela simplicidade e didática.
Opaa, massa que ajudou!
Que isso kkk tava dando uma pausa nos estudos da Orange Talents e me sugerem esse canal KK Muito bom, parabéns!
hehehe, vamo que vamo!!
que aula TOP como eu queria que tivessem me ensinado isso antes
Oi Eric, massa que gostou!
Estou tentando fazer um teste unitário mas o Sonar reclama de não cobrir as linhas de código dentro do lambda em ToSpec. Alguma ideia de como eu faço para cobrir isso? No caso Path até return ficam como not covered
Muito bom parabéns por compartilhar conhecimento!
Oi Josue, massa que curtiu!
Muito bom 🙌🙌🙌
Bom demais que gostou!
Muito top Alberto, você manja muito de Spring na Alura tem algum curso de spring que você é o instrutor ?
Oi Carlos, infelizmente na Alura eu não cheguei a gravar algum de Spring!
@@DevEficiente Pois é. Deveria pois você é um melhores programadores Spring do mercado brasileiro. Vou puxar a orelha do Paula Silveira rsrsrs
Muito top Alberto. parabens.
Voce tem algum curso de spring? gostei muito da sua didatica .
Opaaa, não tenho velho :(. Tenho só o treinamento do deveficiente, para praticar habilidades de qualidade de código.
Muito top, me salvou!
hehee, massa!
Fazer paginação e ordenação por meio do Pageable é muito simples na maioria dos casos, dificuldade começar aumentar quando precisa ordenar por uma coluna de tabela oriunda de JOINs. Agora Alberto me chamou muito atenção essa consulta que desconhecia ser possível: @Query("SELECT u FROM Usuario u WHERE u.nome= :#{#busca.nome}")
A possibilidade de passar um objeto como parâmetro na assinatura do método e na montagem da consulta ir acessando suas propriedades. Sabe informar se esse recurso pertence nativamente a especificação da JPA/JPQL?
É da expression language do spring mesmo. Depois ele traduz para a JPQL válida da JPA :).
Fala, Alberto. Falando sobre DDD, a paginação seria feito em nosso application service? Se sim, não ia rolar usar todos esses detalhes de infra, né!?
Será que rola um vídeo mais detalhado respeito?
🤩
Oi Vinícius, eu preciso admitir para você que faz um tempo que deixei de lado essas práticas. Acho o livro do ddd ótimo, mas peguei o que achei legal, juntei com o lance da carga cognitiva que falo e tentei achar um estilo de design adequado as aplicações que desenvolvo e facilito.
Amigo, onde está o código do vídeo para acompanhar no teu guthub? Vídeo Top!!!
Ainda preciso subir, falhei na missão aqui.
é possivel fazer os filtros dinamicos e um groupby no predicate?
Oi Ricardo, rola sim. Apenas vai rolar um esforço a mais por conta de todo código necessário na Criteria para que você monte um group by. Se fizer, depois responde aqui :).
Opa, boa tarde!
Qual o repositório deste projeto no seu git, pfv?
Oi Antonio, esse acho que não criei repo :(
Como eu aplico isso em APIs que não utilizam o DTO?
Opa, acho que não muda muito. Você vai receber os parâmetros da paginação, realizar a query e devolver o que precisa. Me perdoe se eu não tiver entendido corretamente.
@@DevEficiente acho que a pergunta correta seria. Como utilizar esse método em projeto que utiliza factory?
@@DevEficiente eu até consegui fazer esse método do vídeo, porém tem um problema, ele fica duplicando os registros da tabela.
Por exemplo se tem 3 registros com o mesmo ID ele retorna os 3, porém só com os dados do primeiro. Você sabe como resolver isso? Visto que é uma tabela que pode ter ids iguais desde que o id de centro custo seja diferente em cada registro igual.
Utilizando Factory esse erro não acontece.
Consegui resolver, usei IdClass para definir o @Id em cada coluna de chave primária.
Eu achei legal a tentativa do Spring de tipar as consultas com a Criteria API, mas no geral... acho que o código fica muito verboso. Com um filtro simples no seu exemplo, foi necessário usar 7 linhas. Espero que eles melhorem isso com as expressões lambda, assim como o C# faz com o Entity Framework.
Ferrou hehe. O linq é um construção inimaginável para o Java. O c# tem uma funcionalidade que permite você manipular a ast do código e que dá um poder bem louco para construir dsl. Tem iniciativas tipo jooq e outras que usam metamodel, mas confesso que não acho o ganho tão legal.
Ah, também é claro que dá para criar wrappers sobre o criteria, através de proxies dinâmicos ou coisas menos sofisticadas. Mas admito que não vejo um resultado final tão legal. O melhor era poder concatenar um pedaço de jpql e tava tudo certo hehe
Parabéns Alberto! Conteúdo muito bom e claro!!
Só uma curiosidade, você já usou a abstração criada com kotlin "implementation("au.com.console:kotlin-jpa-specification-dsl:2.0.0-rc.1")"?
Ela deixa o código da specification bem simples com as extensions functions do kotlin:
import au.com.console.jpaspecificationdsl.equal
import br.com.joelamalio.invoicemanagement.domain.entities.Invoice
import org.springframework.data.jpa.domain.Specificationimport java.time.LocalDate
object InvoiceSpecification {
fun equal(dueDate: LocalDate?): Specification = Invoice::dueDate.equal(dueDate)
}
Fiz um texto para ajudar a comunidade link.medium.com/2DrKLUHgZ8
Oi Carlos, obrigado pelo comentário!!!