Tengo la siguiente consulta:
sql
.select()
.from(ITEMS.join(ITEMSOWNERS).on(ITEMSOWNERS.ITEM_ID.eq(ITEMS.ID)))
.join(USERS).on(ITEMSOWNERS.OWNER_ID.eq(USERS.ID))
.leftJoin(ITEMSREVIEWERS).on(ITEMSREVIEWERS.ITEM_ID.eq(ITEMS.ID))
.join(USERS).on(ITEMSREVIEWERS.REVIEWER_ID.eq(USERS.ID))
.where(PUBLIC_ID.eq(publicId))
.fetchGroups(WALLETS)
Me gustaría conseguir ese en algún tipo de forma de tuplas, teniendo en cuenta que hay dos tipos de USERS
resultados que aquí, es decir, tengo una estructura del tipo:
- ITEMS (given the `WHERE` clause there should be only one of those at most, though)
- OWNERS
- REVIEWERS
Creo que sé que podría utilizar fetchGroups
para obtener a partir Record
de una Map<Item, Record>
, pero no estoy muy seguro de cómo proceder en adelante en lo que respecta a la resultante Record
que debe contener User
el doble, es decir,
innerRecord.into(USERS) // this should work okay, I guess
innerRecord.into(USERS) // how to make this happen on the "second" set of User columns?
Idealmente me gustaría para mapear el segundo User
en un Optional
puesto que no puede ser alrededor.
Es necesario crear un alias sus USERS
tablas. Esto es generalmente una buena idea en SQL (sin tener en cuenta si está usando jOOQ), si se está uniendo a la misma mesa dos veces:
val owners = USERS.as("owners");
val reviewers = USERS.as("reviewers");
sql
.select()
.from(ITEMS.join(ITEMSOWNERS).on(ITEMSOWNERS.ITEM_ID.eq(ITEMS.ID)))
.join(owners).on(ITEMSOWNERS.OWNER_ID.eq(owners.ID))
.leftJoin(ITEMSREVIEWERS).on(ITEMSREVIEWERS.ITEM_ID.eq(ITEMS.ID))
.join(reviewers).on(ITEMSREVIEWERS.REVIEWER_ID.eq(reviewers.ID))
.where(PUBLIC_ID.eq(publicId))
.fetchGroups(WALLETS)
A continuación, puede acceder a las dos columnas de la tabla explícitamente como tales:
innerRecord.into(owners)
innerRecord.into(reviewers)
Idealmente me gustaría para mapear el segundo usuario en una opcional ya que no puede estar alrededor.
No hay tal método en el jOOQ. Envolverlo de forma explícita de la siguiente manera:
Optional.of(innerRecord.into(reviewers))
Una nota sobre la corrección de SQL
No creo que la consulta SQL es correcta. Usted debe unirse a cualquiera de los colaboradores izquierda su mesa a la unión gráfico:
.from(ITEMS.join(ITEMSOWNERS).on(ITEMSOWNERS.ITEM_ID.eq(ITEMS.ID)))
.join(owners).on(ITEMSOWNERS.OWNER_ID.eq(owners.ID))
.leftJoin(ITEMSREVIEWERS).on(ITEMSREVIEWERS.ITEM_ID.eq(ITEMS.ID))
.leftJoin(reviewers).on(ITEMSREVIEWERS.REVIEWER_ID.eq(reviewers.ID))
... o nido que unirse como sigue:
.from(ITEMS.join(ITEMSOWNERS).on(ITEMSOWNERS.ITEM_ID.eq(ITEMS.ID)))
.join(owners).on(ITEMSOWNERS.OWNER_ID.eq(owners.ID))
.leftJoin(ITEMSREVIEWERS
.join(reviewers).on(ITEMSREVIEWERS.REVIEWER_ID.eq(reviewers.ID))
).on(ITEMSREVIEWERS.ITEM_ID.eq(ITEMS.ID))