Para los que tengan dudas de para que sirve una clase DTO (Data Transfer Object) les dejo el siguiente link donde se explica de manera detallada su uso.
https://www.oscarblancarteblog.com/2018/11/30/data-transfer-object-dto-patron-diseno/
Introducción a Spring Boot
¿Qué es Spring Boot?
Características principales de Spring Boot
Instalación de entorno de desarrollo: Windows
Instalación de entorno de desarrollo: macOS
Instalación de entorno de desarrollo: Ubuntu
Dependencias en Spring Boot
¿Qué es una dependencia?
Inversión de control y el patrón de inyección de dependencias
Autoconfiguration y runtime
Anotaciones para indicar dependencias en Spring Boot
Creación de proyecto bajo arquitectura de dependencias
Inyección de dependencia "Component"
Ejemplo de creación de dependencia propia
Configuración general de Spring Boot
Cambio de puerto y path
Uso de properties y valores
Uso de properties con ejemplo de generación de POJO
Qué son los logs y cómo usarlos
JPA con Spring y Spring Data
Modelado de entidades con JPA
Configuración de datasource con properties y classes
Registro en base de datos con JpaRepository
Uso de JPQL en anotación query
Uso de anotación value para apuntar a properties
Obtención de información usando Query methods
Uso de Query methods con Or, and, OrderBy, Between, Sort
Uso de JPQL con named parameters
Uso de anotación transactional
Rollback con la anotación transactional
REST con Spring Boot
CRUD bajo arquitectura REST
Métodos CREATE, UPDATE y DELETE
Probando la API REST
Pagination con Spring Boot
Conclusiones
Sigue aprendiendo Spring Boot
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Aportes 14
Preguntas 6
Para los que tengan dudas de para que sirve una clase DTO (Data Transfer Object) les dejo el siguiente link donde se explica de manera detallada su uso.
https://www.oscarblancarteblog.com/2018/11/30/data-transfer-object-dto-patron-diseno/
Si estás viendo Spring y no te gustó Java ni Spring, y por ejemplo, trabajas con JS? considera que Nest.js o Angular es muy similar a Spring. No te podrás escapar fácilmente de los decorators 😛
El nombre de esta clase en el menú dice “Uso de Query Methods con named parameters”, y en la clase dice “Uso de JPQL con named parameters”, no comprendo porque realizar un Query Method con una sentencia JPQL, en el otro curso de Spring indican que los queries con JPQL se realizan cuando son queries complejos, comprendo que es un ejemplo; pero me confunde este ejemplo o el título de esta clase. Será que en lugar de Query Method es el nombre del método que se quiere implementar utilizando JPQL, para el caso se le puede nombrar al método como GetAllByEmailAndBirthdate, ya que como Query Method este se llamaría FindAllByEmailAndBirthdate
Cuidado con los espacios al momento de utilizar este tipo de consultas. No me tomaba las sentencias, por la no tener en cuenta los espacios.
@Query("SELECT new com.fundamentos.springboot.fundamentos.dto.UserDto(u.id, u.name, u.birthDate)" +
"FROM User u " +
"WHERE u.birthDate=:parametroFecha " +
"AND u.email=:parametroEmail")
Optional<UserDto> getAllByBirthDateAndEmail(@Param("parametroFecha") LocalDate date,
@Param("parametroEmail") String email);
Named parameters
Son parámetros que se envían a nivel de sentencias, estos parámetros serán inicializados dentro los parámetros del método, representándolos por medio de la anotación @Param.
A mi me marco un erro en en el constructor al usar JPQL. Resulta que UserDto deberia usar private LocalDate birthdate; en lugar de una String. Al cambiarlo asi, ya me funciona correctamente.
Cuando se está haciendo la sentencia JPQL hay que tener cuidado con los espacios en cada nueva linéa, por qué luego concatena el string y aparecería cómo una sola palabra
Una obviedad que sino están atentos, no es tan obvia, siempre siempre siempre, fíjense que las propiedades de su entity hagan match con las de sus DTO y Repository, SIEMPRE.
Cuidado con la indentación en el @Query(… les puede salir error si la tienen mal
Un articulo que explica mejor la implementacion de los parameters, ya que aca solo nos dice como funciona, mas no en que caso emplear este tipo de Query.
Se usa principalmente para renombrar esos distintos atributos de nuestra entidad DTO ya que esta entidad esta compuesta por atributos foraneaos de 2 o mas tablas, tambien es importante saber su cardinalidad y nombrarla con la anotacion correspondiente @JoinColumn donde hago referencia a que mi entidad DTO tiene columnas de varias tablas,
Respecto a lo anterior al yo declarar un parametro dentro de la consulta, asi hago referencia a un atributo en especifico, para mejorar la segurdad del atributo hubiera sido de ayuda que en ves de emplear un constructor, empleemos un metodo get, y asi encapsulandolo evitamos un error por inyeccion de JPQL
Pueden construir el DTO con Lombok asi:
@Data
@AllArgsConstructor
public class UserDto {
private Long id;
private String name;
private LocalDate birthDate;
}
Los DTO en su escencia no deberian tener Contructores, solo Getters y Setters
El método que se declaro dentro del repository es:
Optional<UserDto> getAllByBirthDateAndEmail…
El tipo de dato que retorno a un Optional de tipo <UserDto>
Revisando la sentencia SQL, esta sentencia dice, regresa todos los Usuario con birthDate y email tal, en ningún lado dice que solo retorne un registro.
Creo que sería mejor cambiar el tipo de dato a retornar por List
List<UserDto> getAllByBirthDateAndEmail…
Muchas gracias Michael por el curso, me sirvió mucho para poder arrancar mi primer proyecto: )
En mi caso use un query methods:
Metodo para devolver el UserDto:
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?