No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Uso de JPQL con named parameters

24/31
Recursos

Aportes 14

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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:

  • User findByLocalDateAndEmail(LocalDate localDate, String email);

Metodo para devolver el UserDto:

  • private Optional<UserDto> getUserDto(){
    User user = userRepository.findByLocalDateAndEmail(LocalDate.of(2022,8,8), “[email protected]”);
    UserDto dto = new UserDto();
    dto.setId(user.getId());
    dto.setName(user.getName());
    dto.setBirthDate(user.getLocalDate());
    return Optional.of(dto);
    }