Saltar navegación

20260205 JPA-DTO-SPRINGBOOT_2 - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 7 de febrero de 2026 por Raquel G.

1 visualizaciones

Descargar la transcripción

Vale, entonces, vale, ¿qué es lo que iba a decir yo? 00:00:00
Ah, entonces, ahora mi duda es que efectivamente este count P y D no era el problema 00:00:09
y que count P estaba bien, porque cuentas los objetos en sí. 00:00:16
Lo que pasa es que es verdad que ya parece que todo lo que te dice esta GPT tiene sentido 00:00:21
y no siempre lo tiene. 00:00:25
entonces yo creo que eso 00:00:26
eso no hace falta 00:00:28
porque el propio objeto ya es único 00:00:30
no hace falta su id 00:00:33
el propio objeto ya es único 00:00:35
vale, vamos a ver 00:00:36
si eso tampoco funciona 00:00:38
ah, menos mal, porque ya 00:00:40
me estaba entrando ansiedad 00:00:42
ala, estupendo, cada cliente con su número de pedidos 00:00:44
la idea de la unalia es igual que se llama en la clase 00:00:51
la interfaz 00:00:53
¿cómo que? 00:00:54
ah, claro, claro 00:00:56
Claro, porque si no 00:00:58
No va a poder hacer la conexión 00:01:00
Correctamente 00:01:02
Vale, entonces pues aquí 00:01:03
Podríamos haberlo ordenado por orden de lo que fuera 00:01:06
Patatín 00:01:09
Lo que sí que ocurre en JPQL 00:01:09
Que eso es curioso 00:01:12
No existe el limit 00:01:15
¿Recordáis el limit de SQL? 00:01:16
Pues en JPQL creo que no existe 00:01:18
Limit 00:01:20
Con lo cual si tú quieres limitar una consulta de registros 00:01:22
Lo tienes que hacer luego por servicio 00:01:24
este te lo devuelve todo 00:01:26
o de otra manera 00:01:28
o volcado de otra forma 00:01:29
bueno, sí, o construyéndola de otra manera 00:01:32
le pasas un parámetro y cambias aquí la JPQL 00:01:38
o haces algo, no te refieres a eso, ¿a qué te refieres? 00:01:41
en JPQL 00:01:43
algunas consultas te permiten directamente 00:01:44
pasarle un parámetro, igual que le puedes pasar un sort 00:01:46
o un pagination 00:01:48
que te permite hacer el link 00:01:49
ah, bueno, sí 00:01:52
Sí, supongo 00:01:54
Porque a ver, cosas que no estamos usando 00:01:56
Que podríais meteros a usar 00:01:59
Por ejemplo, esta lista 00:02:00
Esta lista podría ser de 200.000 00:02:01
Eso es poco manejable 00:02:04
Entonces podríamos querer 00:02:06
Paginarla, es decir 00:02:08
Que me la devuelva en páginas 00:02:10
Y yo luego recupere las páginas fuera 00:02:12
Pero para eso tenemos que pasarle 00:02:14
Un objeto pageable 00:02:16
¿Vale? 00:02:18
A mí me encanta el nombre 00:02:19
Ya, es que 00:02:20
No sé cómo llamarlo 00:02:23
Pajeable 00:02:24
No, es que se llama pajeable 00:02:25
Es pajeable, tal cual, se escribe así 00:02:27
Pero es pajeable con G 00:02:30
Pero son igual 00:02:34
Ahora sí que se ha probado la asignatura 00:02:37
Vale, es que es así 00:02:44
Ahora dice que no 00:02:48
Se escribe de esta manera 00:02:50
Bueno, traducción 00:02:53
Vale 00:02:55
Conclusión, hay muchísimas cosas 00:02:56
Que podéis hacer 00:02:59
Paginar los resultados por parámetro 00:03:00
Limitarlos por parámetro 00:03:02
Como dice él 00:03:04
Porque en el límite aquí no puedes 00:03:05
Vale, pero bueno 00:03:08
Esto ya entra dentro de vuestro 00:03:10
Vale 00:03:12
Por último 00:03:15
O casi último 00:03:18
Esto es lo que se llama proyección 00:03:20
Que es una cosa muy sencilla 00:03:22
Porque no admite ningún procesamiento 00:03:23
Es una interfaz 00:03:26
Entonces 00:03:27
Que falta el groupby, ¿dónde? 00:03:29
Si lo he hecho bien 00:03:33
Bueno, a ver 00:03:34
Que ponga groupby id y nombre 00:03:35
Vale 00:03:39
Pues esto está muy bien 00:03:39
Y está muy chulo y todo eso 00:03:43
Pero es una versión muy sencilla 00:03:44
Esto es una interfaz 00:03:46
Que en una interfaz ya sabéis 00:03:47
Que no podemos poner métodos 00:03:50
Sí, podemos poner métodos por default 00:03:52
No sé qué 00:03:54
Pero bueno 00:03:55
Los métodos default 00:03:58
Como que han tenido muy poco éxito en la vida 00:03:59
No sé por qué 00:04:01
Es que claro, rompen un poco 00:04:03
La filosofía de la interfaz 00:04:05
Que es, yo soy un contrato 00:04:07
Eso es la interfaz 00:04:09
Ya, pero es que son peligrosos 00:04:11
¿Por qué? 00:04:14
Una interfaz es un contrato 00:04:15
que el que me implemente tiene que cumplir. 00:04:17
Eso está claro. 00:04:20
Si tú pones un método default, 00:04:22
estás haciendo parte del trabajo del otro. 00:04:24
Eso puede ser un problema. 00:04:27
¿Por qué? 00:04:29
Porque los que se incorporan a tu contrato 00:04:29
se pueden incorporar sin hacer el trabajo 00:04:32
y coger tu default. 00:04:36
Y se te puede escapar alguno que no le valga el default. 00:04:37
Entonces, los default tienen cierto peligro por eso. 00:04:40
Bueno, pues entonces, default aparte. 00:04:43
Esto es una interfaz 00:04:46
Una proyección y por tanto 00:04:48
Lo único que vamos a hacer con ella es 00:04:49
Consultar los datos que tiene dentro 00:04:51
Pero no podemos ponerle procesamiento 00:04:53
Para que además me haga cosas con los datos 00:04:55
Para 00:04:57
Yo llamar esos otros métodos 00:04:58
Y que me devuelva 00:05:01
Procesado de este 00:05:02
Es decir, en una proyección 00:05:05
Lo que viene es lo que sale de tu JPQL 00:05:07
Punto pelota 00:05:09
Claro 00:05:09
Pero en el main ya o donde sea 00:05:12
¿vale? entonces podría ser 00:05:14
que nosotros queramos aquí ofrecer 00:05:16
más métodos para que el resultado 00:05:18
de esa consulta ya directamente pueda 00:05:20
yo sacarle más información y más cositas 00:05:22
entonces eso ya 00:05:24
sí que sería el objeto 00:05:26
DTO de verdad, el objeto puro 00:05:28
y eso ya sí es una clase 00:05:30
por ejemplo, vamos a 00:05:31
hacer aquí un DTO 00:05:34
¿dónde estamos? aquí 00:05:36
bueno, puede ser una implementación 00:05:39
o no necesariamente 00:05:47
porque no 00:05:49
exista esta proyección 00:05:51
los DTOs se suelen poner directamente 00:05:52
no suelen ser implementaciones 00:05:55
de proyecciones 00:05:57
entonces pues nosotros nos hacemos aquí 00:05:58
nuestra clase 00:06:01
con DTOs 00:06:02
yo creo, sí, porque normalmente 00:06:07
quieres además procesar algo 00:06:09
venga, cliente 00:06:11
en un pedidos DTO 00:06:13
Ale, este ya es una clase 00:06:15
Con lo cual este ya tiene un estado 00:06:18
Tiene su estado, sus propiedades 00:06:19
En este caso 00:06:21
Pues queremos que tenga 00:06:23
Private long 00:06:25
Private 00:06:28
String 00:06:33
Nombre 00:06:35
El número de pedidos 00:06:39
Que era private 00:06:41
Integer num pedidos 00:06:45
Getty set 00:06:48
Bueno, el set si no lo voy a usar 00:06:49
Uno podría no ponerlo 00:06:58
Vale, un constructor 00:06:59
Con parámetros, esto ya es una clase 00:07:01
Normal y corriente como todas las del universo 00:07:04
Vale, y ahora vamos a ponerle 00:07:05
Un método que a lo mejor 00:07:13
Le interesa a nuestro servicio 00:07:15
Pues ver si el cliente ha hecho 00:07:16
Más de 10 pedidos 00:07:19
Porque si ha hecho más de 10 00:07:20
Pues le vamos a hacer un descuento 00:07:22
Por ejemplo 00:07:25
Pues entonces aquí podríamos poner métodos 00:07:26
Para sacar información 00:07:29
De este objeto 00:07:31
Más allá de estas tres propiedades 00:07:32
En una proyección no puedes sacar más información 00:07:34
Que estas tres propiedades 00:07:36
En un DTO puedes sacar la que te dé la gana 00:07:37
Vale, pues por ejemplo 00:07:40
Vamos a sacar la información 00:07:42
Más de 00:07:43
Más de, es que no sé cómo ponerlo 00:07:51
Supera, venga, supera 00:08:01
Pedidos 00:08:04
Supera pedidos y le pasamos un 00:08:06
Numerito 00:08:09
Y ahora este nos va a devolver 00:08:11
Retún num pedidos 00:08:16
Mayor que n 00:08:20
Vale 00:08:26
Bueno, pues esto ya sí es mucho más útil 00:08:28
porque aparte de recogernos la información 00:08:32
podemos pedirle cosas 00:08:35
que agregan, que hacen 00:08:37
procesamiento sobre el estado 00:08:41
este objeto tiene estado, la proyección no tiene 00:08:42
estado 00:08:45
pues venga, ahora 00:08:45
si ahora devolvemos esto 00:08:51
con el DTO 00:08:53
en nuestro repository 00:08:54
client 00:08:57
en un pedidos 00:09:07
vale 00:09:09
Pues vamos a 00:09:25
Ejecutarlo así, sin más 00:09:27
A ver qué pasa 00:09:30
Vamos a hacer el servicio, perdón 00:09:31
Cliente, service 00:09:33
Vale, ya tenemos el servicio 00:09:38
Que ya más otro método, que me devuelve la lista de pedidos 00:10:03
Y ahora yo ya en mi main 00:10:05
Ese DTO me permite hacer más cosas 00:10:06
Ese DTO 00:10:09
Este DTO ya nos permite 00:10:11
Hacer un poquito más de cosas 00:10:18
Cliente en un pedido 00:10:20
DTO, pues ahora a este ya sí 00:10:22
Que le podríamos hacer 00:10:24
Por ejemplo, vamos a filtrar solo los guays 00:10:26
Por ejemplo 00:10:34
Vamos a filtrar los guays 00:10:36
Claro, entonces pondríamos un filter, lógicamente 00:10:39
Pondríamos un filter 00:10:46
¿Y qué filtraríamos? 00:10:49
Filtraríamos cada elemento en el cual X. supera pedidos de que... 00:10:50
Ya sabes que yo voy incremental. 00:11:00
El DTO que está... ¿Dónde está el DTO? 00:11:13
Aquí estará. 00:11:17
¿Correcto? 00:11:26
Pues ahora mismo 00:11:29
Estoy contándoles el iterador a los de primero 00:11:32
Pero ¿qué hago? 00:11:34
¿Les enseño streams directamente? 00:11:38
Mire que hay un caso 00:11:40
Que hay un caso 00:11:41
El caso es que dependa del anterior 00:11:47
El borrar justo 00:11:49
Dependa del anterior 00:11:52
A ver, que me estoy desconcertando 00:11:53
Que baje hasta donde 00:11:58
Vale, pues venga 00:11:59
Vale 00:12:03
Sí, ¿verdad? 00:12:14
Me estaba dando un poco de angustia poner un escáner 00:12:32
Porque es que 00:12:34
Vale, ya nos 00:12:35
Ala, y ahora ya 00:12:47
Vale 00:12:51
Vale, pues y ahora ya 00:12:57
Esta nueva lista 00:12:59
Service. 00:13:00
De cada una de ellas 00:13:03
Vamos a 00:13:05
Mostrar solamente 00:13:06
El nombre de los guays 00:13:09
Con lo cual 00:13:10
No vamos a hacer un system.out.println 00:13:12
Sino x. 00:13:14
Nombre 00:13:21
Pues esto nos va a mostrar 00:13:21
Un segundito 00:13:24
Nos va a mostrar los nombres 00:13:25
de todos aquellos que hayan pedido 00:13:28
más de n pedidos 00:13:30
y me sobran muchos puntos y comas 00:13:32
me sobráis 00:13:34
muchos en general 00:13:38
vale 00:13:39
ahora ya si 00:13:43
me va a mostrar los nombres de todos 00:13:46
los que hayan pedido más de esto 00:13:48
y esto, hombre 00:13:49
pues con un DTO magnífico 00:13:52
sin un DTO tengo que volcar 00:13:54
el cliente entero 00:13:56
de cada cliente 00:13:57
ahora ya contar 00:14:00
en su propiedad pedidos 00:14:01
que fácil, pues que necesidad 00:14:03
si yo me hago un DTO y ya lo tengo ahí todo 00:14:06
claro, nosotros aquí estamos en nuestro 00:14:07
main que parece que es nuestro teléfono 00:14:10
pero tú estás en un método 00:14:11
de un API REST o algo 00:14:13
y no quieres ponerte ahí a hacer mamonadas 00:14:16
o no quieres hacer un servicio que tenga muchas mierdas 00:14:17
pues un DTO, mira que bien te esconde 00:14:19
todo esto 00:14:22
también estáis convencidos, ¿verdad? 00:14:22
vale, vamos a ver 00:14:25
si esto funciona, le vamos a dar 00:14:28
uno, porque es que no tengo clientes 00:14:30
que hayan pedido más de 00:14:32
dame número 00:14:33
¿qué clientes han pedido más de un 00:14:37
pedido? 00:14:41
toma ya, esto sí que es bueno 00:14:42
ah, pero este es a propósito 00:14:44
este ha sido a propósito 00:14:46
no puedo 00:14:49
no puedo 00:14:51
sí, no, este era esperable 00:14:52
creo que es este, o sea, he puesto uno a propósito 00:14:59
que iba a petar, que creo que es este 00:15:02
vale 00:15:03
pues, y el problema de este 00:15:04
es que no se entiende 00:15:08
nada de lo que dice 00:15:10
no tengo un convertidor capaz de convertir 00:15:11
un tipo 00:15:14
tipo, astra, tupla 00:15:15
tupla, tipo, eso ya como que 00:15:17
nos da pistas 00:15:20
no soy capaz de convertir una tupla 00:15:21
a un tipo 00:15:24
¿dónde hay una tupla aquí? ¿de qué tupla me hablas? 00:15:25
esto es una tupla 00:15:29
o sea, una tupla es 00:15:30
un pack de datos 00:15:31
no soy capaz de convertir a tipo 00:15:33
claro, porque esto 00:15:36
es un DTO y tiene su propio constructor 00:15:38
entonces 00:15:40
no es como la interfaz 00:15:42
que la interfaz no tiene constructor, no tiene nada 00:15:43
y el mapeo 00:15:46
aquí es rígido y estricto 00:15:48
Los campos que pongas ahí van a los get de la interfaz. 00:15:49
Aquí, esto es una clase. 00:15:56
Tú puedes tener varios constructores. 00:15:57
Pues, entonces, desde aquí vamos a invocar al constructor 00:15:59
directamente. 00:16:02
Así a lo bestia. 00:16:04
New. 00:16:06
Eso mismo digo yo. 00:16:08
New cliente resumen. 00:16:11
No era resumen. 00:16:19
Era numpedidos 00:16:20
numpedidos 00:16:22
dto 00:16:24
Vale, entonces no estoy 00:16:25
muy segura de que la invocación la pueda 00:16:28
hacer así, pero 00:16:30
no suena bonito 00:16:32
ya, pero 00:16:35
las cosas que no suenan bonitas 00:16:36
te dan muchas sorpresas 00:16:38
No, no, no, porque entonces 00:16:40
cerrarías la jpql 00:16:42
Vale, entonces, eso sí, este 00:16:43
constructor existe 00:16:46
existe un constructor por id en nombre 00:16:47
porque si no existe la hemos liado 00:16:50
si existe 00:16:51
y si no lo hago 00:16:53
por id en nombre y no en pedidos 00:16:55
vale, si que existe 00:16:57
entonces ahora ya si sabe 00:16:58
transformar, castear 00:17:00
como os gusta a vosotros 00:17:03
ya sabe transformar una tupla 00:17:04
en un objeto cliente 00:17:06
ya si lo sabe transformar, pero le estamos diciendo como 00:17:09
le estamos diciendo que sea instanciando el constructor 00:17:11
ya si sabría 00:17:13
Mapear esa tupla si es que he escrito eso bien 00:17:15
Que está por ver 00:17:17
Toma ya 00:17:19
Vale, Semantic 00:17:28
Semantic, bueno, Semantic 00:17:30
Sí, es que lo he hecho a lo bestia 00:17:32
Lo he hecho a lo bestia porque no quería mirar la chuleta 00:17:37
Quería 00:17:40
No me acuerdo de 00:17:40
La mitad de las cosas 00:17:42
Entonces, pero como vosotros 00:17:44
No tenéis mi chuleta, pues vosotros 00:17:47
Lógicamente se lo comentáis a HGPT 00:17:49
Vamos a ponérselo 00:17:50
a ver si esta vez 00:17:52
pero vamos a escucharle con más criterio 00:17:54
porque antes nos hemos creído lo del PID 00:17:56
así sin ningún criterio y nos estamos maleducando 00:17:58
entonces vamos a hacerle 00:18:00
esta consulta, a demostrarle esto 00:18:02
a ver que me saca, a ver si 00:18:04
donde está 00:18:06
que he puesto yo mal aquí en esta 00:18:08
sintaxis 00:18:12
a ver 00:18:13
nombre y nom pedidos 00:18:16
vamos a ver donde estás, aquí 00:18:20
que hay 00:18:21
mal 00:18:32
aquí 00:18:34
dos puntos, está mal en dos sitios 00:18:35
que count p no es válido, pero que 00:18:42
sí es válido, que esta no es 00:18:44
esta no es, vale 00:18:46
as no se usa dentro de un new, ah, vale 00:18:48
eso ya sí que era muy raro 00:18:51
vale, con lo cual 00:18:52
c y de nombre 00:18:55
p y d, vale 00:18:57
y ahora 00:19:00
entonces, si yo no pongo el as 00:19:02
él estos datos, como los inyecta 00:19:04
por constructor, ya el get 00:19:07
sí que va a funcionar 00:19:09
porque el get los recupera 00:19:11
del estado 00:19:12
que ya se ha inyectado en el este 00:19:14
vale, pues de tu primera 00:19:16
sugerencia que countP no es válido 00:19:19
pasamos, pero no pasamos de la segunda 00:19:21
¿vale? 00:19:23
sí, efectivamente, yo según escribía el as 00:19:26
decía, a mí no me suena nunca haber ejido tanto 00:19:28
vale, genial 00:19:30
vamos a ver así 00:19:35
¿ha petado? joe, qué suerte 00:19:38
Vamos a seguir 00:19:42
A ver 00:19:43
Apetado 00:19:49
Cliente en un pedidos 00:19:52
DTO 00:20:03
Cliente en un pedidos DTO 00:20:04
No la puedo resolver 00:20:06
Cliente en un pedidos 00:20:09
La he llamado bien, ¿no? 00:20:11
Es eso todo lo que dice 00:20:13
Vamos a pararle 00:20:14
Efectivamente 00:20:15
Estábamos con que 00:20:19
Este nombre de clase no es el nombre real 00:20:20
Dentro de una string 00:20:23
Esto no significa nada 00:20:24
Con lo cual con .dam2.dto 00:20:26
Así se llama nuestro paquete 00:20:32
Y ahora ya por vuestras caras de satisfacción 00:20:34
Supongo que lo habéis probado y que ha funcionado 00:20:37
¿A poco? 00:20:39
Me parece que hace Iberrate 00:20:41
A ver, venga 00:20:43
Porque si nos falla 00:20:44
Así que tenemos que resolverlo sin chagp 00:20:48
Dame número 1 00:20:50
Toma ya, venga 00:20:52
Ilegal exception 00:20:54
Or Spring Framework DAO 00:20:56
Invalid data access type 00:20:58
No puedo instanciar 00:21:00
¿No tiene constructor? 00:21:02
Porque es long 00:21:04
Ah, vale, porque él usa long siempre por defecto 00:21:04
Vale, entonces 00:21:08
Venga, voy a cambiar el 00:21:10
Bueno, pues esto 00:21:12
Somos autónomos afortunadamente 00:21:13
Para algunas cosas todavía somos autónomos 00:21:16
Sí, hombre 00:21:18
Hay cosas que 00:21:20
Sabemos resolver rápidamente 00:21:21
Venga, pues entonces esto me permite 00:21:23
Cambiar mi constructor 00:21:26
Lo que pasa es que mira que es exquisito 00:21:27
Porque anda que no podría hacer un app 00:21:30
Casting de integral 00:21:32
A long, entiendo que al contrario no 00:21:34
Seguro 00:21:36
Venga 00:21:40
Bueno, pues sois 00:21:44
Conscientes de que provocando 00:21:46
todos estos errores y resolviendo 00:21:48
todos estos errores, aprendemos mucho más 00:21:50
que si hubiéramos acertado de buenas a primeras. 00:21:52
Sí o no. 00:21:56
Claro, a mí me parece 00:21:58
mucho mejor método de aprender las cosas. 00:21:59
Ponerlas así, un poco 00:22:03
al azar, a ver qué pasa, arreglo 00:22:04
lo que ha ocurrido, que de buenas a primeras, 00:22:06
es decir, esto se hace así, funciona, 00:22:08
nos vamos a casa. Pues es un problema. 00:22:10
Venga. 00:22:13
A ver si hay suerte 00:22:13
y nos siguen pasando cosas. 00:22:16
Dame número, uno 00:22:18
Ya, por fin 00:22:27
Después de muchos errores que nunca jamás se nos van a olvidar 00:22:29
Nunca, ya 00:22:32
No se ha funcionado 00:22:33
Vale, estos son los clientes con más de 00:22:35
Un pedido 00:22:38
¿Vale? 00:22:39
Bueno, ¿todo el mundo satisfecho? 00:22:45
¿Que no? 00:22:49
¿Te falla? Vale, pues ilústranos 00:22:53
¿con qué te falla para que 00:22:56
Materias:
Programación
Niveles educativos:
▼ Mostrar / ocultar niveles
  • Formación Profesional
    • Ciclo formativo de grado superior
      • Segundo Curso
Subido por:
Raquel G.
Licencia:
Todos los derechos reservados
Visualizaciones:
1
Fecha:
7 de febrero de 2026 - 19:03
Visibilidad:
Clave
Centro:
IES ROSA CHACEL
Duración:
22′ 58″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
111.96 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid