20260205 JPA-DTO-SPRINGBOOT_2 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
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
Id
00:06:27
Private
00:06:28
String
00:06:33
Nombre
00:06:35
Y
00:06:37
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
X.
00:13:19
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
e
00:18:54
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