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 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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 鈥淯so de Query Methods con named parameters鈥, y en la clase dice 鈥淯so 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

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.

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);

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);
    }