20260205 JPA-DTO-SPRINGBOOT_1 - 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. Pues habíamos visto que aparte de los métodos que te ofrece ya Spring Data JPA por el hecho de implementar una clase que herede de esta, que son los básicos del CRUD, recuperar por ID, por clave primaria, recuperar todos, borrar por clave primaria y save, o sea, persistir, que serían un poco los básicos.
00:00:00
Pues aparte de los básicos uno puede construir
00:00:23
Sus métodos propios
00:00:26
Basados en el propio
00:00:27
Nombre del método o en una consulta
00:00:30
Las dos formas básicas
00:00:32
Y pum, te los construye
00:00:34
Automáticamente JPA
00:00:36
Entonces
00:00:37
Recuperar por otro
00:00:39
Campo de
00:00:42
De la entidad
00:00:43
Find by y el campo de la entidad
00:00:45
Y ya está, y JPA te lo construye entero
00:00:48
No tienes que hacer nada
00:00:50
Es el ejemplo más típico
00:00:51
Pero vamos, se puede jugar más
00:00:53
De esto, esto es como JPQL
00:00:55
Que si uno se mete, pues ve que hay muchas más posibilidades
00:00:57
Pero ya sabemos las posibilidades
00:00:59
Y luego uno ya se puede meter a ver más cosas
00:01:01
Hay más reglas
00:01:03
Me refiero
00:01:05
O sea, hay más cosas que uno puede
00:01:06
Generar automáticamente a partir del nombre
00:01:12
Que exclusivamente la consulta
00:01:14
De consultar por otro campo
00:01:16
Puedes consultar por campo
00:01:17
Mayor o menor que no sé qué, si es numérico
00:01:20
Puedes hacer más cosas
00:01:22
Puedes consultarlo y además que te lo dé ordenado
00:01:24
O sea, solamente
00:01:27
Por el nombre, siguiendo ciertas reglas
00:01:28
En lo que pones en el nombre
00:01:30
Ya puedes hacer métodos
00:01:32
Que genere Spring Data JPA
00:01:34
Su código automáticamente
00:01:36
Si, creo que es order by
00:01:37
No es sort, pero vamos, sería algo así
00:01:42
Si le pones hgpt
00:01:44
Reglas para no sé qué, pues nos daría
00:01:46
Las que tiene, supongo
00:01:48
Que tiene unas cuantas
00:01:49
vale, que queremos consultas
00:01:51
específicas que no podemos generar
00:01:54
con este protocolo que
00:01:56
tiene tan chulo de a partir del
00:01:58
nombre del método que me genera el código automáticamente
00:02:00
pues plantamos la query
00:02:02
y ya está, vale
00:02:03
como aquí que hicimos esta query
00:02:06
para recuperar
00:02:07
un cliente no por un campo
00:02:09
suyo, sino por un campo de pedido
00:02:12
que tiene una lista dentro
00:02:14
entonces pues aquí
00:02:16
la ventaja del join en JPQL
00:02:18
es que no tenemos que hacer un join
00:02:20
basado en un campo de la tabla
00:02:23
porque es que aquí no hace falta
00:02:25
porque ya está dentro de cliente
00:02:27
pedidos, entonces ya
00:02:29
con poner el join lo que
00:02:31
significa aquí es, oye coge el cliente
00:02:33
pero coge también todos los pedidos
00:02:35
que tiene, coge los todos
00:02:37
aquí también está
00:02:38
el inner y el left que a ti te gusta
00:02:41
tanto, Daniel, también se
00:02:43
podría poner inner y left
00:02:45
inner join y left join
00:02:47
inner join y left join, uno de los dos
00:02:48
nunca sé cuál
00:02:50
uno de los dos es el que
00:02:51
cuando tú unes
00:02:54
una tabla con otra, con uno de los dos
00:02:56
te coge, aunque las
00:02:58
otras sean null, te las coge
00:03:01
también las originales y en el otro
00:03:02
si con la que enlazas no hay
00:03:05
son nulles, no te coge las originales
00:03:06
pero vamos, nunca sé cuál es
00:03:08
inner y cuál es left, pero bueno
00:03:10
no da igual, ¿verdad?
00:03:12
cuando pones el left
00:03:14
no te dejaría los clientes que no tienen pedidos
00:03:18
cuando pones el inner te deja clientes
00:03:21
aunque no tengan pedidos también
00:03:23
seguramente, no lo sé
00:03:24
bueno pues entonces esta
00:03:26
era una consulta que recuperábamos
00:03:28
por un campo de dentro de pedidos
00:03:31
luego no nos quedaba más remedio que hacer el join de pedidos
00:03:33
y aquí ya poníamos la condición
00:03:35
que fuera
00:03:37
pues en este caso era que fuera similar
00:03:37
a el patrón
00:03:41
con delante y detrás lo que fuera
00:03:43
pero podría ser igual, que es el primer
00:03:45
caso que hicimos, entonces
00:03:47
si le ponemos la query, pues le damos el nombre
00:03:49
que nos dé la gana, lógicamente
00:03:51
lo más explicativo posible, claro
00:03:53
y si la query tiene parámetros, pues
00:03:55
hay que poner un pack
00:03:57
de estos, un pack de estos
00:03:59
por cada parámetro, vale
00:04:01
y ya está, y JPA la genera
00:04:03
todo, que esto es realmente lo que es
00:04:05
bonito y bueno de JPA
00:04:07
que te haga los métodos solos
00:04:09
esto es lo chulo
00:04:11
¿Puedes poner más de un concepto ahí?
00:04:13
¿Puedes poner coma y luego...?
00:04:15
Sí, sí, sí.
00:04:17
Pones un pack de eso separado por coma
00:04:17
por cada incógnita que tuvieras en tu query,
00:04:20
porque podrías tener varias incógnitas.
00:04:22
Todas ellas empiezan con los dos puntos delante.
00:04:24
¿Vale?
00:04:27
Aquí pusimos este
00:04:28
para poner un método que fuera a cargar con los pedidos
00:04:30
y aquí es donde vimos
00:04:33
que el cell, si no ponemos el fetch,
00:04:34
en el jpql, si no lo ponemos,
00:04:37
te consulta los pedidos
00:04:41
para hacer lo que fuera, o sea, los tiene en cuenta
00:04:43
para luego hacer la consulta, la web
00:04:45
o lo que fuera, los tiene en cuenta, pero no los
00:04:47
mete, no los incorpora en él
00:04:49
es decir, respeta el lazy
00:04:51
este join respetaría el lazy si lo hubiera
00:04:53
sin embargo
00:04:55
si queremos que en la consulta que
00:04:57
hagamos, ese cliente devuelto
00:04:59
si incorpore también sus pedidos
00:05:01
aunque tengamos un lazy
00:05:03
en la anotación, pues
00:05:05
ponemos aquí después
00:05:07
el fetch, ¿vale?
00:05:09
entonces este método lo hicimos pues para recuperar
00:05:10
los clientes con todos sus pedidos
00:05:13
y que no nos saliera lazy bla bla bla
00:05:15
¿vale? luego ya desde el servicio
00:05:17
pues uno hace sus métodos y se acabó
00:05:19
¿vale? aquí es donde nos quedamos el otro día
00:05:21
¿vale? y bueno
00:05:23
esto está muy bien pero
00:05:25
estos
00:05:27
tres métodos que hemos puesto de ejemplo
00:05:29
que podrían ser
00:05:31
300.000 más
00:05:33
tienen la característica de que
00:05:34
todos ellos nos devuelven un objeto
00:05:37
entidad entero, el cliente entero
00:05:38
que en este caso el cliente entero
00:05:41
no es tan gordo, o sea, tiene
00:05:42
ID, nombre y lista de pedidos
00:05:44
¿vale? tiene ID, nombre
00:05:46
y la lista de pedidos, tampoco tiene tanto
00:05:50
pero claro, porque estamos haciendo un modelo muy sencillito
00:05:52
con poquitas cosas
00:05:55
pero en una situación real
00:05:56
las entidades del modelo
00:05:58
tienen dentro la leche
00:06:00
un montón de propiedades
00:06:02
de colecciones que las están ligando
00:06:04
con otras, un mogollón
00:06:06
Entonces, ¿realmente necesitamos que todas las consultas que vamos a poner aquí, luego en los servicios, estén basadas en retornos sobre los objetos enteritos? Seguramente la información me sobre, ¿vale? Yo no necesito tanta información.
00:06:07
O sea, ese método a lo mejor está en particular solo para trabajar con el nombre y no sé qué más del cliente. Entonces, yo estoy condenada a devolver siempre objetos completos con todo lo que tienen dentro, que eso es no solo pesado, sino pues peligroso.
00:06:28
O sea, estoy mandando fuera de mi servicio, estoy mandando el objeto con un montón de información, ¿vale? Es decir, estoy como si estuviera lanzando fuera, exponiendo al universo toda mi lógica de negocio entera cada vez que hago un servicio.
00:06:48
Toda la lógica de negocio
00:07:04
Va para afuera
00:07:06
¿Vale? Entonces, bueno
00:07:06
¿Realmente es necesario?
00:07:09
Siempre va a ser necesario
00:07:12
Hay veces que sí, ¿no?
00:07:14
Si yo aquí quiero devolver
00:07:15
El cliente entero con todos sus pedidos
00:07:17
Con todo, pues ya está
00:07:20
Pero no siempre es necesario
00:07:21
¿Vale? Pues, ¿qué hacemos normalmente?
00:07:22
¿Qué se hace normalmente?
00:07:25
Hacer entidades que no son entidades
00:07:27
Del modelo, sino que están pensadas
00:07:29
Exclusivamente para recoger
00:07:32
datos que tú
00:07:33
quieres consultar
00:07:36
y luego transmitir. O sea, son los objetos
00:07:37
que sirven para almacenar
00:07:39
resultados de consultas.
00:07:41
¿Vale? ¿Perdón?
00:07:43
Como tablas intermedias.
00:07:45
Como si fuera una vista
00:07:47
en el concepto de SQL, ¿vale?
00:07:49
Como si fuera una vista
00:07:51
que tú en una vista seleccionas
00:07:52
qué datos te gustan de una tabla
00:07:55
y no los tienes todos todo el rato
00:07:57
porque es un mogollón. Pues es como si fuera
00:07:59
una vista, entonces no es una entidad del modelo
00:08:01
no forma parte de la lógica de negocio
00:08:03
la lógica de negocio son mis entidades
00:08:06
del modelo y ahí está toda la información
00:08:07
con todas las anotaciones, con todo
00:08:09
entonces yo eso lo dejo ahí protegidito
00:08:11
y lo que
00:08:14
expongo al exterior, lo que mando
00:08:16
fuera a través de los métodos
00:08:18
primero del repositorio y luego del servicio
00:08:20
son estas
00:08:22
vistas, entre comillas
00:08:24
estas vistas que para cada consulta
00:08:25
tienen los datos que le interesará
00:08:27
a esa consulta, exclusivamente esos
00:08:30
y esos ni tienen anotaciones
00:08:31
ni tienen nada, porque no pertenecen a la modelo
00:08:33
ni pertenecen a nada
00:08:35
esos son los famosos DTOs
00:08:36
que se llaman los Data Transfer Object
00:08:39
que forman parte
00:08:41
de cualquier arquitectura de estas
00:08:43
y DTOs, pues de nuevo
00:08:45
es otra capa más
00:08:47
como le gustan a Pablo
00:08:49
pues sí, lo podríamos ver como otra capa más
00:08:50
en realidad no es que sea una capa
00:08:53
es una capa de vistas
00:08:55
es como un paquete con vistas
00:08:58
es lo que yo realmente
00:09:05
quiero mandar hacia afuera
00:09:07
lo que yo realmente quiero mandar hacia afuera
00:09:09
aquí a lo mejor no se ve
00:09:11
tanto la utilidad de eso
00:09:13
pero cuando tienes una arquitectura p-rest
00:09:15
es básico
00:09:17
como ya
00:09:18
veremos la semana que viene
00:09:20
porque tú cuando pides tus objetos
00:09:22
haces tus consultas en una arquitectura p-rest
00:09:25
aquí cuando lo haces
00:09:28
el resultado está en tu propia aplicación
00:09:29
tu propio main o donde sea
00:09:31
y tú pues con eso
00:09:33
ya haces lo que seas, traes lo que quieras
00:09:35
lo pasas a no sé dónde, te metes en el objeto
00:09:37
pero cuando tú haces la consulta
00:09:40
desde un servicio API REST
00:09:42
desde tu web
00:09:43
pues lo que te devuelve es el resultado
00:09:44
de esa consulta mapeado en un JSON
00:09:47
entonces ¿qué necesidad tienes tú
00:09:49
de mapear en un JSON?
00:09:52
un objeto que tiene millones de cosas dentro
00:09:53
un JSON
00:09:56
manejable.
00:09:57
Entonces, tú lo que te haces son
00:09:59
tus data transfer object que tienen
00:10:01
solo la información que necesitas y eso
00:10:03
ya sí que se mapea en tu JSON ya cortito
00:10:05
y manejable. Es que, de hecho,
00:10:07
la locura que se monta,
00:10:09
imaginaos aquí, mapear
00:10:11
esto en un JSON. O sea, yo saco esto.
00:10:13
Saco un cliente
00:10:16
con mi método de servicio y cliente.
00:10:17
Y el API REST, el pobre,
00:10:19
pues, ¿qué hace? Lo que hace
00:10:21
es, te lo mapea
00:10:23
un JSON, porque es lo que tú vas a ver.
00:10:25
Te lo mapea un JSON
00:10:27
Entonces, mapear a un JSON
00:10:28
ID y nombre está bien
00:10:30
Pero ponte a mapear a un JSON pedidos
00:10:31
Muy bien, pedido, me pongo a mapear
00:10:34
En JSON pedidos
00:10:36
Y ID y concepto
00:10:37
Pero ahora tengo que mapear cliente
00:10:40
Muy bien, me voy a poner a mapear cliente
00:10:42
Tiene
00:10:44
ID y nombre, pero tiene pedidos
00:10:45
Con lo cual me meto en un bucle infinito
00:10:48
Entonces, yo de repente hago
00:10:50
Una inocente petición
00:10:52
Y mi página web no para
00:10:53
Claro, solo puedo ñapar
00:10:55
Poniendo anotaciones
00:10:58
Pues ignoran el Jason
00:11:00
Pero ya es hacer una ñapa
00:11:02
Ya es hacer
00:11:03
Una ñapa y decirle a Jackson
00:11:05
Esta propiedad no cuenta, pero claro, no cuenta para la PIRRES
00:11:07
A lo mejor sí cuenta para otros
00:11:10
Conclusión
00:11:11
Deteos, ya está
00:11:14
¿Os lo he vendido suficientemente bien?
00:11:15
No, ya estáis convencidos
00:11:17
¿No? Vale, pues
00:11:19
Entonces
00:11:21
Ya respiro
00:11:23
Porque es que sois un poquito
00:11:26
Exquisitos
00:11:28
Estáis todo el rato, pues no lo veo
00:11:29
Pues yo creo que no sé cuánto
00:11:32
Es que claro, todos hacéis tambalear
00:11:33
Mis cimientos que ya son
00:11:38
Frágiles de por sí
00:11:39
No hombre, ya lo sé
00:11:41
Vale, pues entonces
00:11:46
Seguro que no
00:11:47
Vamos a meterlo
00:11:50
En un paquetito
00:11:52
Y es que realmente
00:11:54
Yo sé que encima os provoco, ya lo sé
00:11:58
Pero es que
00:12:00
La cantidad de paquetes que llevamos
00:12:01
Para solo poder hacer un main
00:12:04
Que en una consulta
00:12:06
JDBC
00:12:08
Es un getConnection
00:12:09
Se ejecute query y ya está
00:12:12
Pues la cantidad de paquetes
00:12:14
Que llevamos, pero claro, ¿quién escala
00:12:16
Una aplicación con JDBC y quién escala esto?
00:12:18
Con JDBC, pues no es trivial
00:12:20
Al escalarla, con esto se supone que sí
00:12:22
Ampliarla
00:12:24
A ver, yo hice
00:12:25
Espera, esto no lo voy a grabar
00:12:33
A ver, no porque
00:12:35
Ya he contado la anécdota
00:12:36
De vieja cebolleta
00:12:40
Seguimos
00:12:41
Vale, pues vamos a hacer
00:12:42
Un paso intermedio, venga
00:12:45
Tenemos aquí una
00:12:47
Una
00:12:49
Un modelo tan pequeñito
00:12:51
Que pocas cosas podemos hacer
00:12:53
Pero por ejemplo, vamos a recoger
00:12:54
El
00:12:57
El nombre
00:12:57
Porque es que en pedido repository
00:13:01
Poco podemos hacer, solo tiene un cliente
00:13:03
Vamos a recoger
00:13:05
El id
00:13:06
Y el nombre
00:13:09
Y algo
00:13:10
Que se salga del
00:13:13
Que sea un agregado
00:13:15
Pues vamos a recoger id
00:13:16
Nombre
00:13:19
y el primero de la lista
00:13:19
ni siquiera el más caro
00:13:22
es que no tenemos ni precio
00:13:24
y el primer pedido de la lista
00:13:25
vale
00:13:29
eso lo podríamos hacer
00:13:31
con un JPQL directamente
00:13:33
pero si no tendríamos que hacer que en el repositorio
00:13:34
nos devuelva a todos y luego en el servicio
00:13:37
ya el primero de la lista
00:13:39
entonces
00:13:40
el cliente con su número de pedidos
00:13:41
cliente y cuantos has pedido
00:13:47
El cliente y cuántos has pedido
00:13:49
Esa sí que es una consulta que quizá tiene más sentido
00:13:50
El cliente y cuántos has pedido
00:13:53
Vale, pues entonces
00:13:54
Esa información se correspondería
00:13:56
A una vista de esta manera
00:13:59
Vale
00:14:00
Primera, hay como dos posibilidades
00:14:02
De DTO, de vistas
00:14:06
Primera, la más
00:14:07
Cliente
00:14:09
En un pedidos
00:14:11
La más sencilla
00:14:13
Es
00:14:18
Yo me hago aquí una interfaz, mi vista es una
00:14:20
interfaz y me da
00:14:22
los datos con el get, vale
00:14:24
pues hemos dicho
00:14:26
era long, verdad, el id
00:14:27
long get id
00:14:30
es uno de los parámetros
00:14:32
el otro era nombre, string
00:14:34
get
00:14:36
nombre
00:14:39
y el número de pedidos
00:14:39
que sería un integer
00:14:44
num pedidos
00:14:46
del cliente
00:14:49
vale, esta es una vista muy sencilla
00:14:53
ahora
00:14:55
entonces fijaos que
00:14:59
puede haber muchos en una aplicación
00:15:05
porque cada consulta es interesante
00:15:08
que tenga agregados de cosas distintas
00:15:10
que son transversales a las entidades en sí
00:15:12
vale, ahora yo ya me voy a mi
00:15:14
repositorio, pues venga
00:15:16
vamos a hacer una query
00:15:17
que ahora veremos
00:15:19
como la hacemos
00:15:23
vale, y esta query
00:15:25
se va a implementar
00:15:32
en el método que me devuelve una lista de esta, me devuelve cada cliente con su número
00:15:34
de pedidos. Get clientes con un pedidos. Entonces no tendría parámetros porque me los tenía
00:15:46
que devolver todos. Y esto pues nada. Y ahora hacemos nuestra JPQL. Vamos a lanzarnos a
00:16:10
hacer lo que sea y si no pues se la pedimos son clientes ahora yo aquí no pongo esto esta es la
00:16:20
historia que aquí no tiene sentido hacer esto from from cliente c vale aquí no tiene sentido
00:16:28
aquí lo que yo pongo son los campos que quiero hacer exacto que serían c punto y de verdad c
00:16:36
Punto nombre
00:16:44
Y ahora
00:16:45
La cuenta de pedidos
00:16:47
Que sería count c punto
00:16:49
Pedidos
00:16:52
Pero claro, para que me tenga los pedidos
00:16:53
En cuenta en esta jpql
00:16:56
Tengo que hacer el join
00:16:58
Si no, no me
00:16:59
Los va a tener en cuenta
00:17:01
Count c punto pedidos
00:17:03
Como el alias
00:17:06
Porque ya le he puesto un alias
00:17:07
Perdón
00:17:10
count es de SQL
00:17:14
¿verdad? en SQL es count y en JPQL
00:17:17
juraría que también
00:17:19
bueno
00:17:21
es como SQL, que da igual
00:17:25
no es sensible a mayúscula, minúscula
00:17:26
¿vale?
00:17:28
en Android por ejemplo lo tenemos
00:17:29
Manoli era sensible a mayúscula
00:17:31
vale, a ver
00:17:35
igual
00:17:37
si os gusta más así
00:17:39
para que se vea claro que esto es JPQL
00:17:40
Y ahora, yo hice pedidos, pero claro, para que no me devuelva, porque la consulta así tal cual, o sea, estoy guiándome por SQL, la consulta así tal cual me devolvería el primer cliente tantas veces como pedidos tiene con su número de pedidos, porque se va a unir a pedidos.
00:17:43
entonces lo tenemos que agrupar, ¿no?
00:18:07
con el group by
00:18:09
group by
00:18:10
lo vamos a agrupar
00:18:13
por c.id
00:18:15
para que todo esto me lo agrupe
00:18:17
los que sean iguales, todos los que tengan
00:18:19
todos los resultados de la consulta
00:18:22
que tengan id y nombre igualitos
00:18:24
pues que lo agrupe
00:18:26
porque todos van a tener el count de pedidos igual, ¿no?
00:18:27
vale, entonces
00:18:30
agrúpamelo
00:18:31
y ya está
00:18:32
yo creo que esta JPQL
00:18:36
estaría bien
00:18:41
vamos a lanzarnos, si no rápidamente la cambiamos
00:18:41
y ya está
00:18:45
porque no
00:18:45
es que no voy a seleccionar el cliente
00:18:49
entero, estoy seleccionando
00:18:51
campos que a mí me da la gana
00:18:53
elegir para formar
00:18:55
esta vista
00:18:57
o sea, estoy construyendo esta vista con campos
00:18:58
sueltos, uno es el ID, otro es
00:19:01
el nombre, pero podría a lo mejor
00:19:03
Ni siquiera creer el ID, entonces no pongo ni el ID
00:19:05
¿Vale? O sea, estoy seleccionando
00:19:07
Campos sueltos de las tablas que estoy
00:19:08
Haciendo, cliente y pedidos unidas
00:19:10
Claro, en este caso
00:19:12
Una lista, claro, porque
00:19:17
No tengo un web, entonces
00:19:18
Todos
00:19:20
Bueno, pues entonces
00:19:21
Esto en principio
00:19:24
Creemos que estaría
00:19:25
Vamos a ponerlo en el servicio, claro
00:19:27
Pues venga, le ponemos
00:19:30
Un método
00:19:39
public list
00:19:40
cliente num
00:19:46
pedidos
00:19:49
y este sería
00:19:51
lista clientes
00:19:55
con num
00:19:58
pedidos
00:20:00
y este te devuelve directamente
00:20:01
clientes
00:20:06
punto
00:20:10
get clientes
00:20:11
num pedidos
00:20:14
ahí está, y ahora nuestro main
00:20:15
que está
00:20:22
Aquí
00:20:26
Nuestro main que está aquí
00:20:27
Todo esto ya nos había funcionado
00:20:31
Y ahora vamos a hacer
00:20:33
Nuestro servicio
00:20:41
Los tabuladores ya ni sé cómo están
00:20:44
Lista clientes
00:20:48
Con numpedidos
00:20:50
Punto
00:20:51
Para cada cliente con numpedidos
00:20:54
Este es un
00:20:56
Interfaz
00:21:00
No tiene un toString
00:21:01
Así que vete a saber el system out cual es
00:21:04
Pues para cada uno de ellos
00:21:06
Vamos a mostrar directamente
00:21:09
Vamos a mostrar
00:21:10
X.getNombre
00:21:19
Del id pasamos para
00:21:23
X.
00:21:27
Claro, JPA es tan listo
00:21:31
Que él ya te instancia un objeto
00:21:33
Que pertenezca a esa interfaz
00:21:36
Cuando te hace la query
00:21:37
¿Vale?
00:21:38
Es decir, ¿qué hace JPA?
00:21:40
JPA cuando haga este select
00:21:42
Claro, le va a dar estos tres valores
00:21:43
Como ve que tiene que volcarlos aquí
00:21:47
Como ve que tiene que volcarlos aquí
00:21:49
Pues te instancia un objeto
00:21:51
Que implemente esta clase
00:21:53
Y te lo mete, y ya está
00:21:54
Y luego tú, ¿qué es lo único que puedes hacer?
00:21:56
Sacarle los datos, no puedes hacer nada más
00:21:58
Sacarle los datos
00:22:00
Entonces vamos a ver si tenemos suerte
00:22:02
Y nos falla
00:22:05
Y podemos arreglar el fallo
00:22:06
¿Qué?
00:22:13
No, ojalá falle
00:22:16
Porque si falle vamos a aprender algo
00:22:17
Eso sin duda
00:22:19
Si no falla no vamos a aprender nada
00:22:19
Bueno, que esto funciona en este caso muy concreto
00:22:21
Pero a lo mejor está muy próximo a un fallo
00:22:25
Y si no lo pillamos
00:22:28
No aprendemos
00:22:29
Claro
00:22:30
Qué poca resistencia
00:22:33
La tolerancia a la frustración tenéis
00:22:38
Qué suerte hemos tenido
00:22:40
Vale
00:22:45
El select me lo ha hecho
00:22:46
Con lo cual la
00:22:49
La sintaxis jpql está bien
00:22:50
Hasta ahí hemos llegado
00:22:53
Pero
00:22:53
Invalid method bla bla bla
00:22:55
Get client en un pedidos
00:22:58
Como que no, está mal
00:23:03
Ah, es que he puesto en un pedidos
00:23:04
En lugar de poner get en un pedidos
00:23:06
¿Verdad?
00:23:08
Vale, entonces a ver
00:23:11
¿Dónde está el cliente en un pedidos?
00:23:12
Ah
00:23:14
Vale, vale
00:23:14
Espérate, es que aquí yo me he inventado
00:23:16
Un nombre un poco raro
00:23:18
Vale, getNumPedidos
00:23:19
No he puesto la sintaxis de getter
00:23:22
O sea, he hecho lo que me ha dado la gana y eso es feo
00:23:24
Vale
00:23:26
GetNumPedidos, vamos a ver ahora
00:23:29
Que podría estar la cosa en otro lado
00:23:31
Vale, null, null, null, null, null
00:23:33
Null, null, null
00:23:44
Va a ser que no tengo la base de datos
00:23:47
Lanzada
00:23:49
Va a ser eso, ¿verdad?
00:23:50
¡Qué problemón!
00:23:59
Vale, a ver
00:24:05
Ahora está lanzada
00:24:06
Si ahora falla, ya sí que
00:24:07
Vamos a vernos en un problema serio
00:24:09
Muy serio
00:24:12
Sí, porque no vamos a tener ni idea
00:24:12
Pero
00:24:15
¿Nul, nul, nul?
00:24:16
¿Y por qué nos aparece nul, nul, nul?
00:24:19
¿Qué he hecho yo mal en la query?
00:24:21
- 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:02
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 24′ 26″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 103.44 MBytes