Este post es fruto de una pregunta sobre el mismo tema que hice y me respondí a mi mismo en Stack Overflow. Aquí voy a reordenar y a poner más clarito lo que aprendí de ella y la solución a la que llegué.

Situación inicial

Voy a explicar el punto de partida sobre el problema que tenía para que podáis entenderlo mejor. Para empezar tenía la siguiente tabla de Categorías:

Una categoría tiene un id y un nombre (name). En caso de que sea una subcategoría, también tendrá el atributo idParent, que es una clave foránea que apunta al id the la categoría padre.

Imaginemos que tengo los siguientes datos:

Aquí quiero el resultado en un mapa agrupado por la categoría padre, cuya estructura sea la categoría padre como key y sus subcategorías correspondientes en una secuencia como value:

Scala Slick 3 relación a la misma entidad

Ahora veamos como resolví esto con Scala y Slick.

Lo primero de todo, defino el esquema (schema), con una query definition para las subcategorías (subcategories), para ayudarme más tarde con la navegación entre objectos.

Una vez que tenemos esto, en el DAO definimos una TableQuery para las categorías y el método findChildrenWithParents, que devuelve justo lo que queríamos:

¿Qué estoy haciendo?

  1. En result, un join de categorías con sus subcategorías ordenado por el nombre de la categoría padre.
  2. Agrupar result por la categoría padre.
  3. Como el resultado de hacer groupBy también contiene a la categoría padre en la secuencia, hago un map del mismo para quedarnos simplemente con las subcategorías.

Aclaración

A ver, esta solución no es 100% perfecta para mi. Si te fijas, en result ya le he dicho a Slick que ejecute la query en base de datos con db.run. Para mi sería mejor tener el groupBy en la query de Slick y después ejecutar la query. Pero me estaba dando problemillas, ya que Slick se quejaba de que la proyección de mi esquema no era adecuada al resultado.

¡Ahora te toca a ti!

Como has visto, no estoy del todo contento con la solución. Funciona… sí, lo sé, llámame perfecionista si quieres… pero no me satisface a 100%. Ahora te toca a ti… ¿Me ayudas con ese groupBy de la Slick query? Si tienes una solución o una mejora, escríbeme un comentario. Si te ha gustado este post, por favor ¡suscríbete y compártelo!