Querys con multiples columnas en JPA (JPA Projection)

Un error bastante común al desarrollar aplicaciones con JPA es volvernos perezosos y acostumbrarnos a siempre traer de vuelta los objetos enteros aun cuando solo necesitemos un par de propiedades.

Otro error común cuando somos principiantes en JPA (más que todo por ignorancia) es hacer varias consultas para obtener varios atributos desde la base de datos sin obtener el objeto completo.

Sin embargo podemos jugar un poco con JPA utilizando JPA projection para obtener solo los atributos que queremos

Imaginemos el siguiente escenario, donde tenemos una clase Foo equivalente a la tabla foo con 5 atributos-columnas.

Asi pues tendriamos

public class Foo{
private int id;
private String codigoUniversalProducto;
private String nombreUniversalProducto;
private BigDecimal existenciaActual;
private BigDecimal pedidosPendientes;
/*Getters y setters*/
}

Ahora bien imaginemos que nuestro servidor es de bajo rendimiento y por cada atributo nuestra implementacion de JPA tarda alrededor de 0.02 segundos en hacer el mapeo, por cada fila que obtengamos de la base de datos tardaremos 0.1 segundos.

Si esto lo traducimos a un resultset de 5000 filas tendriamos automaticamente 500 segundos solo para efectuar el mapeo. Obviamente estos tiempos son sobredimensionados pero imaginemos que este resultset es parte de una logica más grande y que es necesario hacer varias consultas a la misma tabla para algun procedimiento dentro de un EJB donde SOLO necesitamos los atributos de nombre y de existencia actual.

Si hacemos cuentas al solo obtener de regreso dos columnas de la base de datos en lugar del objeto completo, la operacion de mapeo tardaria 0.04 segundos en lugar de 0.1 segundos, con el resultset de 5000 filas tendriamos 200 segundos de operaciones de mapeo, interesante reducción no?.

¿Solución?

Solo obtener las columnas que necesitamos y eso lo hacemos con JPA projection, JPA projection es una funcionalidad de JPA para realizar mapeos de varias columnas dentro de una tabla y obtenerlas de tal forma que sean manipulables como objetos (el objetivo de los ORM), en JPA tenemos dos modos de funcionamiento SELECT con expresiones multiples, y utilizando constructores.

SELECT con expresiones multiples

Analogo a lo que realizamos con sql plano con JPA podemos hacer una consulta sobre las columnas que necesitamos. Por ejemplo

SELECT f.codigoUniversalProducto, f.nombreUniversalProducto FROM Foo AS f

Si ejecutamos esta query lo que obtendremos sera un listado de objetos de tipo generico Object. Dependiendo si fueron una o más  columnas este Object representara otro objeto de tipo Object[] o un tipo de dato en particular si nuestra query fue sobre una sola columna.

Por ejemplo:

List Object[] results =  em.createQuery("SELECT f.codigoUniversalProducto, f.nombreUniversalProducto FROM Foo AS f").getResultList();
for (Object[] result : results) {
System.out.println("Codigo: " + result[0] + ", Nombre: " + result[1]);
}

SELECT utilizando constructor
Sin embargo si queremos ir un poco más alla tambien podemos utilizar los constructores de nuestros objetos (mi metodo preferido). Con esta alternativa estariamos utilizando de nuevo los POJO’s que utilizabamos sin rediseñar nuestra arquitectura, por ejemplo con la query anterior deberiamos agregar el siguiente constructor a nuestro POJO:

public foo(String codigoUniversalProducto, String nombreUniversalProducto)
{
this.codigoUniversalProducto=codigoUniversalProducto;
this.nombreUniversalProducto=nombreUniversalProducto;
}

Y utilizamos este constructor desde nuestra expresión JPA

SELECT NEW org.shekalug.tuxtor.Foo(f.codigoUniversalProducto, c.nombreUniversalProducto)FROM Foo AS f;

La query anterior es totalmente equivalente y un ejemplo de uso seria:

String queryStr = "SELECT NEW org.shekalug.tuxtor.Foo(f.codigoUniversalProducto, c.nombreUniversalProducto)FROM Foo AS f;"
List Foo resultado = em.createQuery(queryStr).getResultList();
for(Foo fooObjeto:resultado)
{
System.out.println("Codigo: "+foo.getCodigo()+" Nombre: "+foo.getNombre());
}

Vale la pena resaltar que se puete utilizar cualquier POJO independientemente si represente una tabla o no.

Misma cara nuevo peinado

Después de casi un año regreso \o/, aun no se ingles pero si he mejorado y seguiré con el experimento y al fin veo la luz al final del tunel en la Univerisidad. Creo que ya es tiempo de retomar la escritura aca.

Luego de que toda Guatemala dejara la onda blog y se metiera en la onda social media (porque aceptemoslo es más difícil encadenar 3 párrafos coherentes que 250 caracteres con estupidez permitida), he visto que un par de bloggers de vieja escuela regresan y creo que eso me motiva(no pseudobloggers que copiaban noticias esos ahora ya solo ponen links en twitter).

Un par de cosas que han pasado en estos dias:

¿Sigo usando FLOSS?

Si

¿Trabajas con FLOSS?

Tambien

¿En serio trabajas con FLOSS?

Si

¿Promoves FLOSS?

Si pero de diferente manera

¿Otros blogs, cual es cual?

-Este blog (donde el TODO #1 es poner más cosas sobre java para aportar a Guatejug)

–En ingles (que seguira enfocado en Gentoo y en reflexiones persionales)

–Mi fotolog

¿Nuevo peinado?

-Si, ahora el blog es compatible con social media para estar cool, pero no le cambie el template porque me gusta

¿Que esperar de ahora en adelante?

Más java, más codigo, mismas reflexiones, menos eventos y . . .

las mismas locuras que hicieron que 70 personas en algun momento de su existencia me agregaran a su rss y/o entrega via mail.

Y por ultimo gracias a todos por no aprovechar ninguna vulnerabilidad en mi wordpress porque lo tenia desatendido.

Si aun no se han dado cuenta todas las lineas a excepción del saludo tienen menos de 240 caracteres (sarcasm mode off).

Saludos 🙂

Cerrando . . .

. . . . por unas semanas.

Hace tiempo les comente que tenia otro blog experimento para practicar mi gramática en ingles. Sin embargo por mi falta de tiempo siempre termino escribiendo todo en español. La idea original era mantener ambos blogs con contenido paralelo pero no tengo el suficiente tiempo. Asi que mientras no tenga TOEFL para seguir estudiando este blog permanecerá en la inactividad.

Pueden seguirme (y corregirme) en este blog y ver un par de fotos en mi fotolog.

Espero que no sea mucho tiempo 🙂

Terminando el dia . . .

FLOSS Barcamp Xela

Un Barcamp es basicamente una reunion de conferencias basadas en anarquia donde todos participan con el fin de compartir conocimiento. Aca en .gt han habido un par y solo puedo decir que he ido a uno y terminaron en un pleito web que simplemente me parecio gracioso ^_^.

Pero bueno la gente de xelalug va a organizar uno para este fin de semana, centrado en FLOSS y creo que voy a asistir. Lo mejor de todo es que no se si dare charlas o no. Solo se que voy a participar :P.

Si se deciden echar el viaje o son de Xela, nos vemos el sabado.

Mi nueva Scrum vida – reglas vrs. guias

Como algunos ya saben estoy tratando de independizarme y fortalecer un proyecto personal de desarrollo y soporte, que espero que termine en algo más grande. Y ya que aun no estoy dedicado al 100% al ambito laboral la verdad prefiero que sea en algo mio y no codeando como desquiciado (si necesitan algo pregunten jajaja) por mala paga.

Continue reading →

La carta de Scott McNealy

La verdad hoy simplemente estoy harto de que una noticia tan irrelevante como una tablet sobrevaluada y sin multitarea me estuviera chingando la existencia con su «ruido». Algunos de mis conocidos me preguntaban o me proporcionaban links acerca de la «novedad» de apple aun cuando estaba marcado como ocupado (y por tal motivo me desconecte un rato)

Sin embargo creo que es más importante para la industria de software (entiendase todos aquellos que hacen software y no se creen geeks por comprar gadgets con status social incluido) la compra definitiva de Sun por parte de Oracle luego que la Union Europea diera luz verde la semana pasada.

Revisando mis feeds me encontre un memo interno de Scott McNealy  publicado en CNET despidiendose de la gente de Sun y me quedo con esta sección:

Sun did not cheat, lie, or break the rule of law or decency. While we enjoyed breaking the rules of conventional wisdom and archaic business practice, and for sure loved to win in the market, we did so with a solid reputation for integrity. Nearly three decades of competing without a notable incident of our folks going off course morally or legally. Not all executives and big companies are bad. Really. There are good companies out there. Special thanks to all of my employees for this. I never had to hide the newspaper in shame from my children.

que en español va más o menos asi (no soy traductor jurado asi que pueden objetar :D):

Sun no hizo trampa, mintio o rompio las leyes o las reglas de la decencia. El lugar de eso nosotros disfrutabamos romper las reglas de la sabiduria convencional y las practicas arcaicas de negocios, y seguramente ganar en el mercado, lo hicimos con una reputación solida  de integridad. Casi tres decadas de competir sin un incidente notable de nuestra gente fuera de los rumbos de la moral o legalidad. No todas las grandes compañias y ejecutivos son malos. En serio. Existen buenas compañías allá afuera. Agradezco especialmente a todos mis empleados por esto. Nunca tuve que esconder el periódico por vergüenza con mis hijos.

Aunque yo siempre pense que Sun y su apoyo al Software Libre eran simplemente un intento de renovar su ya obsoleto y poco rentable modelo de  software propietario, reconozco que uno de los grandes de Sillicon Valey dice adios y se me hace gracioso que muchos techies se interesen más por un producto que con un par de articulos se podia adivinar que iba a ser malo hasta la 3ra o 4ta generación.

Desde que me gustaban las computadoras me gustaba uno de los tantos lemas de Sun: «we make the net work» del cual afortunadamente encontre el logo. Y estoy seguro que de ahora en adelante voy a tener que seguir aprendiendo un monton porque mi trabajo por accidente o preferencia personal se basa en muchas tecnologias de Sun. Las cuales ahora pasan a ser parte de Oracle y por alguna razon se me hace similar a lo que fue IBM hace tiempo.

Mientras tanto sigo trabajando en OpenOffice, Netbeans y MySQL que de seguro nunca hubieran sido lo mismo sin la intervención de Sun

Cecilia Ferrer&Argonautas buena (muy buena) musica de libre distribución

A inicios de este mes Norman de GULNIC, me sugirio que descargara el disco Organico de Cecilia Ferrer&Argonautas. La verdad mi rollo es más metalero pero como me lo habia pasado con un link de Jamendo, valia la pena por el simple hecho de ser libre y centroamericano (Nicaragua).

A los 3 o 4 dias vi ahi el disco sin escuchar y como andaba en modo relax decidi darle una oportunidad. Musicalmente se definen como rock-pop-indie (con lo cual estoy de acuerdo) y me parece un excelente trabajo. El álbum contiene 9 temas entre ingles y español. Aunque algunas canciones me parecieron muy similares en ritmo y forma, las liricas si tratan temas de distinta indole (se los dejo de tarea 😉 ). A mi gusto es muy buena musica, mucho mejor que lo que producen las maquinarias de mercadotecnia Mexicana con los «shows de realidad» que estan tan de moda por estas regiones.

Esta liberado bajo una licencia de Creative Commons, y puse libre distribución porque algunos argumentan que la CC no es totalmente libre si no permite ingresos monetarios, lo que a mi la verdad me parece totalmente justo en trabajos de indole artistica. Igual si quisieramos comercializarlo Jamendo permite obtener licencias comerciales :D.

El album pueden conseguirlo aca

Y si tienen flash player como el 99% de las personas pueden darle preview aca (conste que es de jamendo):

Mi nuevo autobot

Tuvieron que pasar aproximadamente 5 años para que cambiara mi vieja pentium 4 por algo un tanto mejor. Luego de que trabajara en un par de proyectos, comprara algunas cosas de mi casa, una silla comoda que luego se quebro :(, y otros gadgets. Estaba listo para comprar mi equipo.

Hasta hace pocos minutos se llamaba millenium-falcon ya que todos los equipos de mi casa tienen nombres de Star Wars. Ademas de esto el nombre nace porque pense que iba a reciclar el case anterior y otros dispositivos, pero al final solo rescate mi quemadora de DVD’s asi que ya no tenia tanto sentido y termine rebautizandola como una de mis computadoras favoritas: «teletran-I» (basicamente solo edite /etc/conf.d/hostname).

La configuración es un tanto modesta, aun no llego a un i7 Extreme Edition, pero para lo que me dio el dinero fue esto:

  • Procesador: Intel core i7 860
  • Motherboard: ASUS P755D Pro
  • Disco Duro: Western Digital Caviar Black 1 TB
  • Memoria: 4 GB Corsair XMS3 DDR3
  • Video: EVGA Nvidia GTX 260
  • Fuente: Corsair 750w
  • Case: NZXT M59 Classic Series

Hasta el momento todo ha funcionado perfectamente, solo he utilizado swap un dia que realice pruebas instalando Oracle. Con un disipador Cooler Master Hyper TX3 he logrado un overclock modesto entre 3.0 ghz (con turbo boost) y 3.2 ghz (sin turbo boost). A excepción del triple canal que me hubiera obligado a tener 6GB de ram no tengo nada que envidiarle a un i7-920. Habilitando coolbits en el xorg igual puedo hacer OC a la tarjeta de video hasta más o menos 650mhz sin problemas. Y el kernel a partir de la version 2.6.32 es compatible con los modulos de lm_sensors. En realidad mi objetivo no era overclockear y viniendo desde una p4 casi no es necesario.

El case es un tanto ajustado pero perfecto para mi espacio de trabajo. Con 4 ventiladores en algunos foros he visto overclocks más extremos a 3.4 ghz pero al ser usuario de Gentoo con paquetes como Mysql Workbench o QT-Core he ocupado al 100% los 4 nucleos (8 threads) y despues de todo tampoco tengo un disipador Cooler Master V8.

Por ultimo lo complete con un nuevo mando, un Logitech Rumblepad y un mouse laser iHome bastante ligero con boton directo para cambio de DPI en los juegos.

Aca algunas y imagenes:

[imageflow id=»1″]

No habia hecho este post porque se me hubiera hecho muy presumido hacerlo cuando muy la compre porque los i7 8xx aun eran recientes :D.

Grids, los napster de la supercomputación.

Por si aun no se han dado cuenta ultimamente me interesa el tema de supercomputación y faltaba más ya que en eso se basa mi trabajo de graduación el cual muy probablemente termine atorado en la biblioteca consultado por 2 o 3 fans de Ciencias Computacional/Clustering/Sistemas Operativos o más seguramente como pisapapeles de la secretaria de la escuela. Trabajo que sin embargo estoy tratando de hacer a conciencia porque de querer hacer una cochada de que ratos ya la hubiera terminado y no hubiera perdido el curso xD (pero ese es otro tema 🙂 ).

Continue reading →

¿Los clusters son la solución? ¿Mi solución?

Un par de años atras cuando leia en Slashdot acerca de que una nueva computadora habia logrado superar el mitico #1 del top500, me imaginaba «wow si tuviera esa computadora mi vida seria más facil y realizaria mis tareas más rapido» . . . y estaba totalmente equivocado. Si yo hubiera tenido esa computadora mis tareas ni siquiera se podrian realizar ahi, dado que no todas las aplicaciones son «clusterizables».

Continue reading →