20260203 JPA-SPRING_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. A ver, aquí aparte de indicar cómo construir los bins que Spring va a necesitar, que estas cosas, repito, en mi caso y en el de la gama de los humanos son copias y pegas, lógicamente.
00:00:02
Yo voy ahí mirando, cotilleando, solucionando y ¿qué funciona? Pues ahí lo dejo. Pero podréis ver más formas de construir estos bins, lógicamente. ¿Vale? Más formas. Esto es lo que yo voy copieteando por ahí. Vale.
00:00:16
Hay que decirle a Spring
00:00:32
Que es un fichero de configuración
00:00:35
Claro, vale, pues venga
00:00:36
Es un fichero de configuración
00:00:38
¿Vale?
00:00:40
También hay que decirle a Spring
00:00:42
Que puede que haya más bins
00:00:43
Que los que hay aquí
00:00:45
Puede que los haya, búscalos
00:00:48
En este caso los hay, el repositorio y el service
00:00:50
Pues entonces hay que decirle
00:00:52
A partir de qué
00:00:54
Punto del árbol de paquetes
00:00:56
Tiene que empezar a buscarlos
00:00:58
Oye, búscalos a partir de este
00:00:59
vale, esta anotación
00:01:01
es
00:01:05
para que él infiera
00:01:06
para que él infiera
00:01:08
la de repository
00:01:10
de aquí, vale
00:01:12
si la quitamos
00:01:14
no va a
00:01:16
inferirla y no va a
00:01:19
funcionar, va a decir, no consigo
00:01:20
el binrepositorio, me falta
00:01:22
¿dónde está? no me has dicho que lo maneje
00:01:24
vale, pues poniendo esta
00:01:27
anotación
00:01:28
Spring ya extrae de aquí
00:01:29
Que esto es un bin repositorio
00:01:33
Que tiene que gestionar él
00:01:35
Y esto es para que funcionen
00:01:37
Las anotaciones transaccionales
00:01:40
Ya está
00:01:42
Con toda la implicación que tienen las transaccionales
00:01:42
¿Vale?
00:01:46
Que es que todo ese método en transacción
00:01:47
Rollback si no funciona
00:01:49
Contexto de persistencia abierto todo el rato
00:01:52
Si no está abierto
00:01:55
Tenemos problemas con las cargas
00:01:56
Lazy, etc
00:01:58
Vale, pues entonces
00:02:00
Ahora ya con este fichero de configuración
00:02:02
Ya podemos hacer un main rápido
00:02:04
Que ya
00:02:06
Será nuestro último proyecto
00:02:08
Espero en
00:02:10
Arquitectura esta, porque como ya
00:02:12
Más o menos controlamos
00:02:14
Más o menos
00:02:16
Ya podemos cambiar arquitectura
00:02:18
O bien a esa web que os gustó tanto al principio
00:02:20
A un API REST, me da lo mismo
00:02:22
son controller igualmente, me da igual
00:02:24
que te consulte una máquina, que te consulte una web
00:02:26
a ver, no me da igual, cuando te consulta
00:02:28
una web tienes que construir toda la vista, que es un rollo
00:02:30
si es una p-res no construyes
00:02:32
vista, das el boom en el objeto
00:02:34
y es más fácil
00:02:36
bueno, pues
00:02:37
entonces ahora ya podemos hacernos
00:02:40
nuestro main, a ver si hemos montado bien
00:02:41
la arquitectura correctamente
00:02:44
vamos a sacar
00:02:45
el contexto
00:02:47
de sprint
00:02:49
Y ahora ya el contexto de Spring
00:02:51
Me saca mi bin raíz
00:02:54
El service
00:02:56
Y ahora ya con el service yo hago todo
00:02:58
Todavía estamos haciendo algo a mano
00:02:59
Porque no tenemos Spring Boot
00:03:03
¿Vale? Recordad que
00:03:06
Que ya lo incorporaremos
00:03:07
Que con Spring Boot
00:03:09
Spring Boot ya deduce todo esto
00:03:11
Este fichero ya no está
00:03:14
Porque lo deduce
00:03:16
Y ya que yo sepa no hay más nivel
00:03:17
De ocultación, ya es imposible ocultar
00:03:20
más que lo que oculta Spring Boot.
00:03:22
Así que ya más capas no vamos a poner, Ana.
00:03:24
Después de tres meses de capas
00:03:26
hemos llegado a la capa final.
00:03:27
Sí, pero tienes un conocimiento muy sólido
00:03:29
de base. Y has entrenado
00:03:32
bastante bien el cerebro.
00:03:34
Pero ahí estás.
00:03:38
Cuando tengas que tirar de ello, sobre todo cuando tenés un proyecto
00:03:39
y tengas que interpretarlo,
00:03:42
ese conocimiento está ahí.
00:03:44
Pero que ahora no sé cuál capa es cuál.
00:03:46
No, hombre, si lo sabes.
00:03:49
Pero si es que están clavadas.
00:03:50
jd bc iber jd bc hibernate jp a brindar a sprint sprint
00:03:52
jd bc hibernate jp a esas tres seguidas sprint
00:04:12
en particular Spring Data JPA
00:04:21
más el Spring Core que te gestiona
00:04:24
Luzbin, Spring Boot
00:04:26
más que capa, pues una ayudita
00:04:28
para quitarte la configuración
00:04:30
y ya está, y luego ya todo
00:04:32
eso lo metes en la arquitectura que te dé la gana
00:04:34
vale, que sí, que uno puede meter más
00:04:36
capas, pues si quiere que sea reactivo
00:04:38
si quiere que sea no sé qué, Aitor tiene
00:04:40
mogollón de capas, ah bueno, un Docker
00:04:42
vale, que todo eso lo quieres
00:04:44
meter en un contenedor Docker para no tener
00:04:46
pues, ah un Docker
00:04:48
Vale, que los tienes
00:04:50
Un Docker que lo quieres gestionar por
00:04:53
Kubernetes, que tiene un montón de
00:04:54
Pues Kubernetes por encima
00:04:57
Pero bueno
00:04:58
Vamos a dejarlo
00:04:59
Imagino que ya te has traído, te pulsas
00:05:02
A y te hace lo que quieras
00:05:04
No sé yo, eh
00:05:06
A ver, no lo sé, yo no he conseguido
00:05:08
Que pulsara A y que haga lo que quieras
00:05:10
Pero bueno
00:05:12
Vale, pero ahora
00:05:13
Vosotros podéis
00:05:18
si trabajáis en Java
00:05:19
que Dios lo quiera
00:05:22
que Dios lo quiera
00:05:23
porque vais a ser los mejores
00:05:26
porque ya con todo el esfuerzo que habéis hecho
00:05:27
que has aportado para tus cartas en Java
00:05:30
si, si, somos políglotas
00:05:32
es lo mío que sé
00:05:33
y ni eso, ni eso sé
00:05:35
así que imagínate, bueno pues no, más que eso
00:05:38
con todo el esfuerzo que habéis hecho en Java
00:05:40
pues Dios quiera
00:05:42
que trabajéis en Java un rato
00:05:43
entonces, ¿qué iba a decir?
00:05:45
Hay mucha
00:05:48
Todavía hay bastante gente
00:05:53
Trabajando con el ecosistema Java
00:05:54
En todas sus variantes
00:05:56
El 30%
00:05:57
Pues fijaos
00:06:01
Todas para vosotros
00:06:02
Pues
00:06:03
Trabajando en Java
00:06:06
Veréis proyectos hechos
00:06:08
De muchas maneras
00:06:10
Bien, mal, desastre, maravillosos
00:06:11
Algunos no entenderéis ni patata
00:06:15
Pero no pasa nada
00:06:16
la semana ya lo entenderéis todo
00:06:17
alguno diréis, pero que mal trabajan aquí
00:06:18
vaya mierda, menos mal que he llegado yo para arreglarlo
00:06:21
todo, de todo
00:06:23
de Spring Boot ya es
00:06:24
a ver, puedes poner un Docker para que te gestione ya
00:06:27
¿vale? meterlo todo en un Docker
00:06:29
y encima de Docker el sistema operativo de
00:06:31
Docker, Kubernetes
00:06:33
y encima de Kubernetes
00:06:34
el robot que te lo hace todo
00:06:36
¿no?
00:06:39
y encima
00:06:40
del robot, el humano
00:06:41
Bueno, el usuario
00:06:43
Aquí ya ni pinta nada
00:06:51
Todo esto se hace para usuarios que luego ni existen
00:06:52
Pero bueno
00:06:54
Vale, pues ahora ya
00:06:55
Vale, pues venga, vamos a
00:06:57
Uf, pues me temo que sí
00:07:02
O sea, se ha grabado todo este speech
00:07:06
Se ha grabado todo el speech
00:07:08
En fin, pues ahora ya sí que podemos
00:07:10
vamos a probar a ver si la arquitectura
00:07:13
funciona y a partir de ahí ya podremos meter más
00:07:15
cositas
00:07:17
vale, pues a ver, service
00:07:17
teníamos solamente un servicio
00:07:21
que es
00:07:23
recupera cliente por id
00:07:24
coged un cliente del que tengáis id
00:07:26
un cliente del que tengáis id
00:07:28
el 1
00:07:33
cliente
00:07:34
1
00:07:37
ala
00:07:37
voy a ponerle un tuestrín a cliente
00:07:40
que no sé si lo tengo puesto
00:07:43
para que esto
00:07:44
no me muestre algo feo
00:07:47
un segundo, que le pongo el tuestrín
00:07:49
y vuelvo
00:07:51
¿qué estamos haciendo? pues desde el
00:07:51
main patatero a lo cutre, que esto sí
00:08:00
que es cutre, probar las cosas desde un main
00:08:01
lo reconozco, pero es lo más
00:08:03
cómodo y fácil
00:08:05
pues probar que la arquitectura que hemos hecho de
00:08:06
sprint funcione
00:08:09
vale, entonces, no hemos hecho
00:08:10
nada, o sea, nosotros
00:08:13
programar, es que no hemos programado nada
00:08:15
hemos puesto clases y clases
00:08:17
y clases, millones de
00:08:19
clases, solo para hacer un
00:08:21
seller, cliente
00:08:23
from clientes, web
00:08:25
id, igual a 1
00:08:27
algo que en JDBC habríamos hecho
00:08:28
en una línea perfectamente
00:08:31
controlado, pues hemos hecho aquí
00:08:33
vamos, la leche
00:08:35
solo para hacer esto
00:08:37
yo ahí lo dejo
00:08:39
Para que veáis que
00:08:41
No, yo lo que quiero es que no seáis víctimas
00:08:44
Del tecnooptimismo
00:08:47
Que es el progreso siempre mejora nuestra vida
00:08:48
Pues no
00:08:52
Resistámonos a esa idea también a veces
00:08:52
A veces el decrecimiento
00:08:55
Es la solución
00:08:57
Tú abogas por el decrecimiento
00:08:58
¿No?
00:09:01
Efectivamente
00:09:06
A ver
00:09:07
Uy, qué suerte
00:09:12
Ala, pues ya está
00:09:14
Todo el rollo para hacer esto
00:09:19
Todo el rollo para hacer esto
00:09:21
Vale
00:09:26
¿No se ha funcionado a todo el mundo?
00:09:27
No
00:09:30
No se ha funcionado a todo el mundo, ¿no?
00:09:30
El ID
00:09:42
Lo tienes como interior o como long
00:09:43
Como long, por eso yo le he puesto la L
00:09:46
En el entity
00:09:48
Sí, en el
00:09:51
O sea, lo tengo aquí como long
00:09:52
Lo tengo en cliente como long
00:09:54
En mi caso lo tengo como long
00:09:55
Todo el rato, porque estas clases
00:09:58
Se las pedía HGP desde el script
00:09:59
Y como
00:10:02
Estaba como begin, lo puso como long
00:10:03
Vale
00:10:06
¿Dónde estaba yo aquí en el main?
00:10:12
¡Hala!
00:10:15
Pues ya está, y con esto ya podríamos tirar
00:10:16
Y hacer un proyecto hiper mega
00:10:18
maravilloso que hiciera millones de cosas
00:10:20
con mis clientes y mis pedidos
00:10:23
¿Vale?
00:10:24
A ver
00:10:39
Vamos a hacer una cosa
00:10:40
¿Cómo? A ver, te hace un create table
00:10:43
si tienes aquí
00:10:50
create en esta propiedad
00:10:51
¿Dónde estamos aquí?
00:10:53
O si no tienes la base
00:11:00
de datos
00:11:01
Te crea la tabla otra vez
00:11:02
Teniéndola ya
00:11:06
Pero has puesto aquí el nombre de la base de datos
00:11:09
Bueno, me has cambiado al tuyo
00:11:14
A ver si has dejado el mío
00:11:15
Yo que sé
00:11:17
Yo también tengo el mío
00:11:17
Y a mí me hace drop table, drop pivot
00:11:20
Y luego hace un create
00:11:22
Y
00:11:24
Pues con aquí en UPDATE
00:11:27
Solo si cambia el esquema
00:11:31
Si no cambia el esquema no debería tirar la basura
00:11:33
A lo mejor habéis cambiado alguna
00:11:35
Propiedad, alguna cosa que hace
00:11:37
Que él vea que es diferente
00:11:39
El modelo de la
00:11:41
Es que por defecto ponía create
00:11:42
En tu caso
00:11:45
No lo creo
00:11:47
Tú tienes ubdate a palo seco
00:11:48
No tienes ubdate create
00:11:52
Ni nada de eso
00:11:54
Bueno pues
00:11:55
¿Tenías creado? Vale, vale
00:12:01
Entonces vamos a hacer una cosa
00:12:03
Voy a guardar el cliente aquí
00:12:04
¿De qué?
00:12:06
Este proyecto entero lo voy a subir ahora
00:12:24
Pero ahora mismo, ¿te refieres?
00:12:26
De la tabla, porque como nos la ha borrado
00:12:28
Las tablas y las ha vuelto a crear
00:12:30
No hay datos ni nada
00:12:32
mete tú cualquiera rápidamente aquí
00:12:33
te metes unos, es mucho más rápido que ejecutar
00:12:37
un script, mete los que te den la gana
00:12:39
ahí, metes dos o tres
00:12:41
para probar y ya está, vale, entonces
00:12:42
estaba yo aquí
00:12:45
que por qué queremos que nos dé error
00:12:46
para que nos acordemos de esto
00:13:01
vale
00:13:09
porque, vale
00:13:10
aquí
00:13:14
Y es donde, es uno, donde vemos que hibernate no nos lo pone tan fácil.
00:13:16
Porque yo quiero mi cliente, recupero cliente con el método que me ofrece el repositorio.
00:13:23
Es que no los he hecho yo, yo no los he hecho.
00:13:31
Entonces, si yo quiero que me hagan las cosas, pues tengo que aceptar sus reglas.
00:13:34
Y sus reglas son, dime.
00:13:40
Porque no tendrás puesto aquí
00:13:42
Create, en vez de Udate
00:13:51
Cuando dices
00:13:52
Me dropea, querías decir me elimina
00:13:57
Vale, porque es que
00:13:59
Dropear ya te vale
00:14:03
Vale
00:14:04
Igual teníais
00:14:09
Create, porque cuando yo subí esto
00:14:13
Lo tenía como create
00:14:15
Claro, y lo cambié luego después
00:14:16
A lo mejor
00:14:18
Vale, vale
00:14:19
Pues puede ser
00:14:22
Vale, pues lógicamente esto
00:14:28
Como bien habéis intuido
00:14:32
Algunos
00:14:35
A que esto era una excepción como la ropa de un pino
00:14:35
¿Verdad?
00:14:39
Porque esto ya no lo sabemos de memoria
00:14:41
El cliente se ha recuperado
00:14:42
Sin sus pedidos
00:14:45
Porque aquí tenemos esto
00:14:46
Que, ¿dónde está?
00:14:48
Ah, concha, aquí está
00:14:52
Aquí tenemos esto
00:14:53
Entonces en el servicio no tenemos que ejecutar todos los pedidos
00:14:55
Claro, pero entonces
00:14:57
¿Cómo arreglamos esto?
00:15:01
Pues uno diría, ay, pues no pasa nada
00:15:07
Pongo aquí el Iger, pero hombre, esa no es la solución
00:15:09
Poner el Iger
00:15:11
Entonces aquí el problema, ya sabemos cuál ha sido
00:15:12
Que el servicio
00:15:15
este de aquí
00:15:17
tira de find by id
00:15:18
que no lo he hecho yo
00:15:21
y find by id
00:15:22
te lo coge y te coge
00:15:24
abre el
00:15:27
contexto de persistencia, te coge el cliente
00:15:29
y lo
00:15:31
y lo cierra el contexto de persistencia
00:15:33
y no puedo elegir
00:15:35
yo que haga, que funcione
00:15:37
de otra manera, ¿vale?
00:15:39
primer problema de Spring, yo aquí no elijo
00:15:41
el contexto de persistencia cuando está vivo
00:15:43
no lo puedo elegir, es imposible
00:15:45
entonces como no lo puedo elegir porque es imposible
00:15:46
pues estoy
00:15:49
condenada para la eternidad
00:15:51
a este lazy exception
00:15:54
a menos que decida
00:15:56
pasar de este método
00:15:58
¿vale? a menos que decida pasar
00:15:59
de este, porque este no me vale
00:16:01
entonces
00:16:03
¿habría algún método que me ofrezca
00:16:05
el repositorio que me lo recoja
00:16:08
con sus pedidos?
00:16:09
pues seguramente no, si no lo hay
00:16:11
pues estoy jodida
00:16:13
Vamos a ver
00:16:14
¿Qué métodos me ofrece?
00:16:16
Define
00:16:21
Pues define
00:16:22
Find, all, find, nada
00:16:24
Find, all, find
00:16:26
All by the, find by the
00:16:27
Find
00:16:30
Nada
00:16:30
No puedo hacer nada
00:16:32
Efectivamente
00:16:35
Pues entonces
00:16:39
Que el repositorio me ofrezca ya muchas cositas
00:16:40
No significa
00:16:44
que no le pueda yo poner las mías propias
00:16:45
¿vale?
00:16:48
entonces yo, a las que me ofrece él
00:16:49
que es el cruz básico
00:16:51
¿lo pondrías en el repositorio y no en el service?
00:16:52
no, en el repositorio
00:16:57
métodos de repositorio
00:16:58
porque el service tira del repositorio
00:17:00
entonces lo tengo que poner en el repositorio primero
00:17:02
¿vale? porque el service
00:17:04
¿de dónde tira? si es que no tengo
00:17:06
ni JBC, ni tengo DAO, ni tengo nada
00:17:07
es que aquí estoy
00:17:10
muy angustiada
00:17:11
Lo tengo que poner aquí
00:17:14
Pero claro, esto es una interfaz
00:17:15
Entonces, yo no puedo aquí
00:17:17
Implementar un método
00:17:20
¿Vale? Pero no pasa nada
00:17:21
Es que Spring es tan listo
00:17:24
Que del propio nombre
00:17:27
Del método
00:17:29
Él ya infiere un montón de cosas y se lo inventa
00:17:29
¿Vale?
00:17:32
O bien lo infiere del nombre
00:17:34
O si del nombre no se puede inferir
00:17:36
Porque es demasiado complicado
00:17:38
Le pongo yo una query al lado
00:17:39
Y le digo, oye, este método es esta query
00:17:41
Le pongo una query jpql y tan listo, ¿vale?
00:17:43
Por ejemplo, vamos a hacer métodos propios para este de
00:17:46
aquí.
00:17:50
Vamos a suponer que quisiéramos, ¿vale?
00:17:51
Vamos a ponerle aquí métodos propios.
00:17:54
Métodos propios.
00:18:01
Vamos a hacer métodos propios para el repository, ¿vale?
00:18:04
Entre ellos, uno que nos va a interesar, pues,
00:18:07
es recuperar con pedidos, por ejemplo.
00:18:10
Vale, pero hay más
00:18:11
Hay como
00:18:13
5 millones
00:18:14
Hombre, métodos propios tantos como imaginación tengas tú
00:18:16
Pero casuísticas
00:18:20
Una casuística muy típica
00:18:21
Que es, vamos a recuperar por otra cosa
00:18:23
Que no sea el ID, por otro campo
00:18:25
Eso es algo que normalmente queremos hacer
00:18:26
Pues eso, afortunadamente, Sprint
00:18:28
Me permite expresárselo
00:18:31
Con el nombre del método
00:18:33
Y ya no tengo que hacer query, yo ni tengo que hacer nada
00:18:34
Con el nombre del método
00:18:36
Entonces, por ejemplo, vamos a recuperar clientes por nombre
00:18:37
clientes por nombre no es clave primaria
00:18:40
entonces yo
00:18:42
me tiene que recuperar una lista de clientes
00:18:44
vale
00:18:46
el public ya sabéis que en una interfaz no hace falta ponerlo
00:18:47
entonces
00:18:50
de que manera le digo a
00:18:51
sprint que me recupere por otro
00:18:54
parámetro, pues find
00:18:56
by
00:18:57
y aquí pongo el nombre del otro
00:18:59
campo, empezando con mayúscula como los
00:19:02
get, pues si yo tenía
00:19:04
en cliente un nombre
00:19:06
Pues aquí en client
00:19:08
Find by nombre
00:19:11
¿Vale?
00:19:13
Y aquí le tengo que pasar el parámetro, lógicamente
00:19:15
Y ya está
00:19:17
Tal cual
00:19:19
Si es que es muy mágico
00:19:21
Así por la cara
00:19:22
Por la cara
00:19:24
Él lo implementa deduciéndolo del nombre
00:19:26
¿Vale?
00:19:29
Y no solo eso, hay más variantes
00:19:30
Aquí creo, aquí ya sí que tendría que mirar la chuleta
00:19:32
Incluso le puedes decir que te lo he ordenado
00:19:35
order descendente o algo así
00:19:38
no lo sé, tendríamos que consultarlo
00:19:40
pero no me lo sé en memoria, pero le puedes
00:19:42
poner más, creo que de hecho
00:19:44
en algún sitio lo tengo aquí
00:19:46
vamos, vamos a ver
00:19:48
no sirve de nada, no lo pregunto
00:19:49
entonces, ¿qué coño me tengo que hacer?
00:19:53
esto es un juego
00:19:54
claro
00:19:55
o lo anterior
00:19:56
después enseñamos esto
00:20:00
vamos a llegar a eso donde voy a decir, bueno, con J
00:20:02
debe ser
00:20:04
A ver
00:20:04
Los dos días antes del examen
00:20:06
Los dedicaremos
00:20:09
Podemos hacerlo un poquito antes
00:20:12
No, un poquito antes
00:20:13
A ver, solo nos queda
00:20:15
Lo único que yo quiero
00:20:17
Lo único que yo quiero que veamos aquí un poquito más
00:20:19
Es esto metido en arquitectura
00:20:22
PIRRES con Spring Boot
00:20:24
Y
00:20:25
Y luego MongoDB
00:20:27
MongoDB, ver las pautas de MongoDB
00:20:29
Cómo funciona y acceder con él es de Java
00:20:31
Eso es un doble vacío
00:20:33
MongoDB es una trata no nacional
00:20:34
Más sencilla
00:20:36
Hombre, MongoDB tiene una complejidad
00:20:37
No se quiere meter, pero bueno, MongoDB más o menos de qué va
00:20:39
Esas son las dos cosas
00:20:42
Que yo quiero ver, que se ven en un par de proyectos
00:20:44
Y luego
00:20:46
Y luego ya cuando
00:20:47
Acabemos eso
00:20:50
Que en tres clases lo hemos acabado
00:20:50
O sea, en tres días lo hemos acabado
00:20:53
Pues hacer una especie de compendio de todo lo que hemos visto
00:20:54
Para resituarnos
00:20:57
Antes de nuestro examen
00:20:59
Que será
00:21:01
A ver, en principio sí
00:21:02
Sí, sí, sí
00:21:07
Que tiene que acabar todavía
00:21:08
Sostenibilidad
00:21:11
Dile que no hace falta
00:21:12
Porque para hacer un test
00:21:14
Y navegar por internet
00:21:16
Podemos estar aprendiendo a hacer
00:21:18
Sostenibilidad ya está la capa del estado
00:21:20
¿Eh?
00:21:21
Sostenibility
00:21:26
Vale, pues entonces
00:21:27
Aquí vamos a mostrar
00:21:29
Demostrar
00:21:30
Ya
00:21:31
Bueno, hay que sostenerles a ellos
00:21:36
Ay, que no he hecho el servicio
00:21:38
Cachas
00:21:41
Vale
00:21:42
Entonces realmente
00:21:45
Esto de tantas capas es un rollo
00:21:49
Porque un repositorio
00:21:51
Un servicio
00:21:54
Recupera
00:21:55
clientes nombre, string nombre, retun, vale, retun clientes, que es el repositorio, punto, find by nombre, ahí está,
00:21:58
vale, ya tengo en el servicio
00:22:24
el find by nombre
00:22:27
vale, accedo desde el servicio
00:22:28
ya era en mi main
00:22:31
llama service.
00:22:32
recupera
00:22:36
clientes nombre
00:22:37
que este es el que hemos hecho nosotros
00:22:38
bueno, y el de arriba también, que era servicios
00:22:40
que es mucho gusto
00:22:43
recupera clientes
00:22:44
lo único que hace es llamar
00:22:49
al método del reproductorio que acabamos de hacer
00:22:50
No hace más que esto
00:22:52
Estamos haciendo todo muy rápido
00:22:54
Bueno, a ver, no hemos hecho ninguno
00:22:56
Cliente 1
00:23:00
Voy a recuperar cliente 1
00:23:02
Que yo aquí puse a propósito para hacer la prueba
00:23:03
Dos clientes que se llamaran igual
00:23:06
Para que me recuperaran los dos
00:23:07
Cliente 1
00:23:09
Y esto como es una lista
00:23:14
Pues vamos a
00:23:16
Mostrarle los clientes
00:23:18
De esa lista
00:23:21
Correcto, vale
00:23:21
pues él ha construido
00:23:42
solo el solito, el select
00:23:45
a partir del nombre del método
00:23:46
entonces hombre
00:23:49
hay que reconocerle algunas cosas
00:23:51
¿no?
00:23:52
que haga estas cosas solo
00:23:55
está muy bien
00:23:56
vale, entonces
00:23:58
hacer métodos que recuperen
00:24:00
por otro parámetro
00:24:02
muy sencillo y ya está
00:24:04
pero hay veces que lo que yo quiero
00:24:07
es una consulta un poquito más rara
00:24:09
Por ejemplo, recuperar todos los clientes, a ver, vamos a pensar uno y luego le pedimos al JPQL, imaginaos que queremos recuperar todos los clientes que han pedido, pedidos, ¿qué? Pedido que tiene, ID y concepto.
00:24:11
que han pedido bolis
00:24:30
claro, que han pedido bolis
00:24:34
o por concepto
00:24:38
entonces, esto no es un método tan sencillo
00:24:39
de poner porque concepto
00:24:42
no es un parámetro de cliente
00:24:43
entonces, aprovecharme de esto
00:24:45
de aquí, pues no puedo
00:24:48
vale, el barra baja te deja
00:24:49
coger de dentro de
00:24:54
puede ser
00:24:55
sí, no lo sé
00:25:00
pero bueno, vamos a ponerlo como ejemplo
00:25:01
de consult método en el cual yo quiero
00:25:04
una query en concreto, quiero que haga una query
00:25:06
mi query, haz esta query y devuélveme
00:25:08
entonces, ¿qué query necesitaríamos
00:25:10
hacer para
00:25:12
recuperar todos los
00:25:14
pues una query jpql
00:25:16
que lógicamente no la vamos a hacer
00:25:18
nosotros, no vaya a ser que nos
00:25:20
cansemos y pensemos
00:25:22
demasiado y aparte porque no sabemos hacer
00:25:24
jpql
00:25:26
a ver, sí que sabríamos en realidad
00:25:27
select cliente
00:25:30
vamos a tratar de escribirla
00:25:32
a ver hasta donde llegamos
00:25:35
y luego con lo que sabemos
00:25:36
si que sabríamos escribirla
00:25:38
vale, entonces yo le digo aquí
00:25:40
esto es una query
00:25:42
vale, y ahora me voy a hacer
00:25:43
mi query
00:25:47
mi query en jpql
00:25:49
sería select, que quiero seleccionar
00:25:51
cliente
00:25:52
cliente
00:25:54
from
00:25:56
Cliente C
00:25:59
¿Vale?
00:26:02
C, front cliente C
00:26:06
Ahora
00:26:08
Tengo que ligarla con pedidos
00:26:10
Porque la búsqueda va a ser en pedido
00:26:12
Entonces esto tengo que hacer un join
00:26:15
Que tanto os gusta
00:26:17
Vale, aquí el join no es
00:26:18
Con el nombre de tabla
00:26:21
Es with
00:26:23
C.úneme con sus pedidos
00:26:24
¿Vale?
00:26:27
Únemelo con sus pedidos, por favor
00:26:29
Porque si yo no pongo join con sus pedidos
00:26:30
No me carga sus pedidos
00:26:33
No me los carga
00:26:35
Vale
00:26:35
Vale, entonces esto es para decir
00:26:36
Cárgame también los pedidos, ojo, que son P
00:26:41
Y ahora, ¿cuál es mi cláusula de búsqueda?
00:26:43
Where
00:26:49
Joler
00:26:50
Where
00:26:52
P, que es el pedido
00:26:54
Punto, concepto
00:26:56
Igual al parámetro
00:26:58
Que el parámetro jpql
00:27:01
recordad que es dos puntos con el nombre
00:27:03
que a mí me dé la gana poner
00:27:05
concepto, por ejemplo
00:27:06
vale
00:27:08
ahora le preguntamos
00:27:09
a GPS si lo hemos escrito bien
00:27:13
vale, y ahora yo aquí pondría mi método
00:27:14
que es
00:27:17
list cliente
00:27:17
recupera
00:27:23
clientes
00:27:26
por
00:27:29
la verdad es que
00:27:30
Estando en un repositorio debería ponerlo en inglés
00:27:33
Find clientes
00:27:35
By
00:27:39
Concepto
00:27:40
Y ahora yo le tengo que decir
00:27:43
Que
00:27:46
Que lo que yo le voy a pasar aquí
00:27:46
Es un parámetro
00:27:51
Vale, le tengo que decir aquí
00:27:52
Que esto lo tiene que usar
00:27:55
Como parámetro para inyectarlo aquí
00:27:57
Entonces esto lo hago
00:27:59
Con esto de aquí
00:28:01
Vale
00:28:05
No sé si lo he escrito bien del todo
00:28:05
Para
00:28:09
Eh
00:28:11
Stream
00:28:12
Creo que el stream hay que ponerlo delante
00:28:16
A ver, se lo voy a pasar así
00:28:18
Entre los HGPT porque
00:28:22
Más cómodo que buscar la chuleta por ahí en mis proyectos
00:28:23
Vale
00:28:27
A ver que me dice
00:28:28
Casi
00:28:40
Vale, en param, vale, el param
00:28:42
Eh, ah, vale, vale
00:28:44
Es que lo tengo que pasar aquí
00:28:46
¿Qué estaba faltando?
00:28:49
El para
00:28:54
El parámetro
00:28:54
Claro, el nombre del parámetro, parezco tonta
00:29:00
Vale
00:29:02
Este es el primer del nombre
00:29:06
Lógicamente a este le llamo
00:29:08
Como me dé la gana
00:29:10
A este le llamo como quiera, lógicamente
00:29:11
¿Vale?
00:29:14
Entonces
00:29:17
Este parámetro de aquí
00:29:18
va a servir para inyectar este
00:29:20
que esta query tiene
00:29:22
más parámetros, más incógnitas
00:29:24
aquí separo por comas
00:29:26
para bla bla bla
00:29:28
¿vale?
00:29:29
el concepto del para
00:29:32
sería el dos puntos
00:29:34
concepto, claro, esto es como
00:29:36
la interrogación del SQL
00:29:38
del prepare de statement
00:29:40
dos puntos delante y esto de ahí
00:29:42
bueno pues
00:29:44
esta de aquí
00:29:46
Ahora tendríamos que hacer un servicio
00:29:48
Claro
00:29:52
Y este así a lo bestia
00:29:53
Pues directamente retune
00:30:18
Clientes
00:30:19
Y esto era
00:30:22
Find by clientes concepto
00:30:24
Y ahora en nuestro main
00:30:32
En nuestro main
00:30:34
De aquí
00:30:43
Recupera clientes por concepto
00:30:43
Ponedle alguno
00:30:51
A ver pedidos
00:30:53
Vale
00:30:56
Pedido a uno, yo lo tengo dos veces
00:31:02
Pedido a uno por dos clientes distintos
00:31:05
Entonces puedo poner
00:31:07
Pedido a uno
00:31:11
No sé si estaba con mayúscula o minúscula
00:31:12
Con minúscula
00:31:15
Pedido a uno
00:31:17
Vale, aquí la verdad es que
00:31:22
En una consulta real
00:31:31
Sí, voy un segundo
00:31:33
¿Cuál? ¿Este?
00:31:37
es llamar al otro que hemos hecho
00:31:55
y ya está, vale, la verdad es que
00:31:56
en una consulta real
00:32:06
no haríamos
00:32:07
esta query de aquí
00:32:10
donde estamos, en cliente repository
00:32:11
no lo haríamos aquí con el igual
00:32:13
haríamos un like
00:32:15
que tuviera el, no, haríamos
00:32:17
para que el concepto no fuera clavado
00:32:20
vamos a
00:32:21
cámbiame
00:32:24
la jpql
00:32:29
para que el concepto
00:32:31
contenga un patrón, porque es que si no
00:32:36
Que se queda muy feo
00:32:38
Concepto contenga
00:32:39
Un patrón
00:32:41
En lugar de ser
00:32:43
Tal cual
00:32:46
Venga, le ponemos esto
00:32:47
Que es mucho más bonito, que sea igual tal cual
00:32:56
Vamos a ponerle esto
00:32:59
Así queda mejor
00:33:01
Que el concepto se parezca
00:33:16
O contenga
00:33:19
Esto de ahí
00:33:20
Ahora mejor, entonces si yo ahora en mi main
00:33:21
Si yo ahora en mi main
00:33:25
pongo pedido sin más, me va a sacar
00:33:29
ciento y la madre, porque todos son pedido
00:33:31
A, pedido B, pedido C
00:33:33
vale, pues con el like más bonito
00:33:34
voy a poner este y me tiene que sacar tropecientos
00:33:38
tropecientos, porque
00:33:41
todos son así
00:33:42
a ver si es verdad que me
00:33:43
saca tropecientos
00:33:47
voy
00:33:48
a ver si funciona, porque, ah bien, la query
00:33:54
estaba bien
00:33:56
y al final veis
00:33:57
todo es SQL
00:34:00
jdbc está abajo
00:34:02
con su pico y pala
00:34:04
¿vale?
00:34:06
¿y qué querías ver?
00:34:08
el concat que está
00:34:11
aquí
00:34:12
no, se lo he preguntado a él
00:34:13
le he dicho, si quiero que contenga un patrón
00:34:25
se lo he cambiado
00:34:27
le he dicho, cámbiame la jpql
00:34:29
¿dónde se lo he preguntado?
00:34:32
bueno, aquí
00:34:36
cámbiame la jpql para que el concepto
00:34:36
contenga un patrón en lugar de ser tal cual
00:34:39
porque hombre, es una búsqueda más real
00:34:41
más realista, normalmente
00:34:43
me gustaba más que el igual
00:34:45
¿cómo?
00:34:47
sí, hay upper case
00:34:56
lower, hay lower y upper
00:34:58
en JPQL por lo menos
00:34:59
y en HQL
00:35:01
supongo que en SQL
00:35:03
no sé si en SQL hay lower y upper
00:35:05
no lo sé, aquí sí lo hay
00:35:07
porque me suena haberlo visto
00:35:09
a ver, hay muchísimas posibilidades
00:35:10
entonces efectivamente esto
00:35:13
teniendo la idea básica, pues uno
00:35:15
Entonces podríamos ya que nos ponemos
00:35:17
Vamos a incorporarle el método
00:35:19
Para quitar el lazy exception
00:35:21
Este famoso
00:35:23
Que nos había dado aquí
00:35:24
Si yo quiero ver el número de pedidos del cliente
00:35:27
Después de haberlo recuperado
00:35:29
Pues vamos a hacerle un método
00:35:31
Que me recupere con pedidos
00:35:33
Entonces
00:35:35
Nos vamos a hacer
00:35:36
Otra consulta por query
00:35:40
Otra consulta por query
00:35:43
Pero ahora que la query sea
00:35:47
Seleccioname el cliente
00:35:49
Con todos sus pedidos
00:35:53
¿Cómo?
00:35:54
No lo probé
00:36:00
¿Por qué? ¿A vosotros no os ha funcionado?
00:36:02
Venga, vamos a probarlo
00:36:04
Espérate que comente esto que estaba haciendo
00:36:06
Igual
00:36:07
¿Así no te ha funcionado?
00:36:13
Yo así no lo he probado
00:36:18
Ah, perdón, este me sobra
00:36:19
Vale, a ver
00:36:23
¿Qué es lo que me falla aquí?
00:36:25
¿Por qué me ha aparecido esta?
00:36:30
¿Por qué me ha aparecido este error ahí?
00:36:32
Porque tengo aquí una llave de más
00:36:38
Ah, no, porque he comentado la llave esta sin querer
00:36:39
Vale
00:36:41
Vale
00:36:43
Entonces
00:36:47
Ahora vamos a poner pedido a uno
00:36:49
Para que sea así tal cual
00:36:52
pero ¿qué te decía?
00:36:54
me decía
00:37:08
que no había conseguido nada
00:37:09
igual al concepto
00:37:11
y el concepto es que la mente es hola
00:37:12
y puse hola
00:37:14
y tienes conceptos que se llaman hola
00:37:16
o sea te daban una excepción
00:37:18
con el contraste sabes
00:37:19
y no se puede
00:37:21
además puse la mayúscula y el menú
00:37:22
lo copio y te dejo
00:37:25
no lo sé
00:37:28
pero estaría bien que lo investigaras
00:37:32
y nos lo cuentes
00:37:34
Vale, entonces
00:37:35
Estábamos haciendo
00:37:37
Espera, voy a poner la que estaba, que me gusta más
00:37:38
Esta
00:37:41
Y ahora la que estaba yo haciendo antes
00:37:43
Era para ya que estábamos
00:37:47
Vamos a devolver
00:37:49
El cliente con pedidos
00:37:51
Para quitar la lazy esta
00:37:53
Entonces aquí es donde
00:37:55
Me falta la llave que he quitado
00:37:57
Entonces vamos a coger
00:37:59
El cliente con todos sus pedidos
00:38:03
con todos sus pedidos
00:38:06
donde cliente.id
00:38:07
sea igual
00:38:10
a el id
00:38:12
y ahora el param
00:38:13
id que sea
00:38:16
long
00:38:18
si es lo que quiero probar
00:38:18
se puede
00:38:29
claro pero lo estoy
00:38:30
uniendo a sus pedidos
00:38:35
lo estoy uniendo a pedidos
00:38:36
claro recuperame cliente
00:38:39
con los pedidos dentro. Entonces, esto se
00:38:41
salta en Lazy, porque le estoy yo forzando
00:38:43
a volver pedidos. El propio
00:38:45
de FindById no se salta.
00:38:47
Claro, el FindById no tiene
00:38:49
join.
00:38:51
No, en cualquier caso, de hacer eso, tendría que
00:38:57
hacerlo en la JPQL, porque aquí yo no puedo
00:38:59
hacer código. Pero es que en la JPQL
00:39:01
ya lo estoy uniendo con esto.
00:39:03
Creo. Es que lo quiero probar ahora
00:39:05
sobre la marcha. ¿Y dónde me
00:39:07
faltan o me sobran llaves aquí?
00:39:09
Ah, es que me sobra una, jolines
00:39:11
Vale
00:39:12
Pues entonces no me gusta
00:39:13
Eh, find clientes
00:39:18
With pedidos
00:39:21
Eh, perdón, tienes razón
00:39:23
Find cliente
00:39:27
By
00:39:29
Adelante
00:39:29
Se puede
00:39:31
Find cliente by id
00:39:33
With pedido y devuelve un único objeto
00:39:37
Cliente
00:39:39
Vale, find cliente by id
00:39:39
Con pedidos, dado ese id
00:39:43
Vamos a ver si lo hemos hecho bien
00:39:45
Tendríamos el servicio
00:39:48
Que sería
00:39:52
Public cliente
00:39:53
Recupera
00:39:59
Cliente con
00:40:04
Pedidos
00:40:07
log
00:40:10
id
00:40:12
este me devuelve
00:40:14
clientes punto
00:40:18
recupera
00:40:22
cliente
00:40:24
by
00:40:25
estoy en service
00:40:26
find
00:40:35
a ver es que esto es porque
00:40:36
tengo el este mal
00:40:38
clientes.findcliente
00:40:40
by id with pedidos
00:40:44
vale
00:40:45
entonces, este me lo recuperaría ya
00:40:46
con todos sus pedidos, entonces yo lo llamo en el
00:40:49
main, ahora
00:40:51
voy a llamar al cliente
00:40:53
que será
00:40:57
así, recupera cliente
00:40:59
con pedidos y ahora voy a intentar
00:41:01
mostrar sus pedidos
00:41:03
y aquí ya si que no me debería salir
00:41:05
la excepción
00:41:07
vale
00:41:08
No, porque hoy tengo que hacer cosas en secretaría
00:41:10
Vamos a comprobar que esto funciona
00:41:16
Y hoy ya tenéis sostenibilidad
00:41:18
Y podéis cerrar ya
00:41:21
¿No venís preparados para sosteneros?
00:41:22
No
00:41:28
C.get
00:41:29
Pedidos.size
00:41:31
Nun pedidos
00:41:35
Vamos a ver
00:41:37
si nos salen los pedidos del cliente
00:41:49
uno, sin dar errores
00:41:52
no nos salen
00:41:54
que mala noticia me has dado
00:41:56
porque tenemos que irnos
00:41:58
que mala noticia
00:41:59
el mismo
00:42:01
el mismo
00:42:20
el mismo
00:42:24
yo hice pedidos
00:42:26
a ti te cortaste
00:42:31
el mismo
00:42:35
- 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:00
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 42′ 39″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 197.32 MBytes