簡體   English   中英

外加入Scala Slick

[英]Outer join with Scala Slick

我有兩個表, UserUserBusinessPartnerIds

User(id, name, email, whatever)

UserBusinessPartnerIds(userId, bpId)

我正在嘗試檢索用戶和業務合作伙伴ID的列表。

以下查詢工作正常!

database withSession { implicit session: Session =>
      val query = (for {
        (user, userBpid) <- Users leftJoin UserBusinessPartners on (_.id is _.userId)
          if user.email === email &&
             user.password === password &&
             user.active === true &&
             userBpid.dateFrom < today &&
             userBpid.dateTo > today
      } yield (user.id, userBpid.bpId.?))

      val results = query.list

      results.headOption.map( row  => User(row._1, email, password, results.map(_._2).flatten.toSet))
    }

當然,代碼的結尾令人發指。 但是無所謂。

問題是,我希望進行OUTER加入。 因此,如果用戶在另一個表中沒有與業務伙伴ID對應的行,我仍然希望獲得該用戶。

有任何想法嗎?

編輯-編輯的問題實際上是正確的。 我仍然想返回一個用戶,即使他們沒有與之關聯的業務伙伴ID

hmmm,生成的sql是什么樣的? 應該是左外部聯接。

我懷疑問題在於:

userBpid.dateFrom < today && userBpid.dateTo > today

由於用戶+空用戶伙伴行,由於可能將條件應用於空值而無法返回; 即,當關聯的業務伙伴ID行不存在時,它們將永遠不會返回true。

作為測試,請執行println(q.sqlStatement)或查看查詢日志,並在有或沒有上述查詢條件的情況下手動運行查詢。

編輯未測試,但嘗試此操作,將用戶業務表別名為一個內部,一個外部。 您可能會遇到一個非唯一的表別名編譯器錯誤,這是我在上一次嘗試一些外部連接魔術的嘗試中發生的

val q = 
  for{
    (u,upo) <- Users leftJoin UserBusinessPartners on (_.id is _.userId)
      if(u.email is email) && (u.password is password) && (u.active is true)
    up <- UserBusinessPartners
      if(u.id is up.userId) && (up.dateFrom < today) && (up.dateTo > today)
    _ <- Query groupBy(u.id)
  } yield (u.id, upo.bpId.?)

您需要在聯接之前過濾UserBusinessPartners表,這將為您提供沒有業務合作伙伴的用戶。 就像是 :

database withSession { implicit session: Session =>
  userBP = UserBusinessPartners.filter(ubp => ubp.dateFrom < today && ubp.dateTo > today)
  val query = (for {
    (user, userbp) <- Users leftJoin userBP on (_.id is _.userId)
      if user.email === email &&
         user.password === password &&
         user.active === true 
  } yield (user.id, userbp.bpId.?))

  val results = query.list

  results.headOption.map( row  => User(row._1, email, password, results.map(_._2).flatten.toSet))
}

篩選器將顯示僅包含所需業務伙伴的表視圖,左側聯接將列出所有用戶。

您的查詢失敗,原因是:

userBpid.dateFrom <今天&& userBpid.dateTo>今天

因為使用空userBpid選擇的行將由於上述條件而被過濾掉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM