Mapeo de tablas combinadas de mismo tipo en JOOQ

Manuel Bernhardt:

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 USERSresultados 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 fetchGroupspara obtener a partir Recordde una Map<Item, Record>, pero no estoy muy seguro de cómo proceder en adelante en lo que respecta a la resultante Recordque debe contener Userel 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 Useren un Optionalpuesto que no puede ser alrededor.

Lukas Eder:

Es necesario crear un alias sus USERStablas. 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))

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=208040&siteId=1
Recomendado
Clasificación