Scala Slick 2 join on multiple fields?

2020-07-08 06:57发布

问题:

how can do joins on multiple fields like in example beneath?

val ownerId = 1
val contactType = 1
...
val contact = for {
  (t, c) <- ContactTypes leftJoin Contacts on (_.id === _.typeId && _.ownerId === ownerId)
  if t.id === contactType
} yield (c.?, t)

How can I achieve this with Slick 2.0.1? Idelly I need slick to generate this kind of query

SELECT
    x2."contact_id",
    x2."type_id",
    x2."owner_id",
    x2."value",
    x2."created_on",
    x2."updated_on",
    x3."id",
    x3."type",
    x3."model"
FROM
    (
        SELECT
            x4."id" AS "id",
            x4."type" AS "type",
            x4."model" AS "model"
        FROM
            "contact_types" x4
    )x3
LEFT OUTER JOIN(
    SELECT
        x5."created_on" AS "created_on",
        x5."value" AS "value",
        x5."contact_id" AS "contact_id",
        x5."updated_on" AS "updated_on",
        x5."type_id" AS "type_id",
        x5."owner_id" AS "owner_id"
    FROM
        "contacts" x5
)x2 ON x3."id" = x2."type_id" AND x2.owner_id = 1
WHERE
    (x3."id" = 3)

Please note ON x3."id" = x2."type_id" AND x2.owner_id = 16

回答1:

Ok, so after digging through websites and source code I think I finally found the solution

leftJoin on() method accepts following parameter pred: (E1, E2) => T, so we simply can do like this

val contacts = for {
  (t, c) <- ContactTypes leftJoin Contacts on ( (type, contact) => {
    type.id === contact.typeId && contact.ownerId === ownerId
  } )
} yield (c.?, t)

Which generated sql query as needed.