2

テーブルが 2 つUserあり、UserBusinessPartnerIds

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 が関連付けられていない場合でも、ユーザーを返したい

4

2 に答える 2

1

うーん、生成された sql はどのように見えますか? 左外部結合にする必要があります。

問題は次のとおりだと思います。

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

null の可能性がある値に条件を適用するため、user + null user-partner 行を返すことはできません。つまり、関連付けられた取引先 ID 行が存在しない場合、true を返すことはありません。

テストとして、println(q.sqlStatement)クエリ ログを実行または確認し、上記のクエリ条件を使用して、または使用せずに手動でクエリを実行します。

編集 テストされていませんが、これを試して、ユーザービジネステーブルをエイリアス化し、1 つを内側、もう 1 つを外側にします。一意でないテーブル エイリアス コンパイラ エラーが発生する可能性があります。これは、以前に外部結合マジックを実行しようとしたときに発生しました。

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.?)
于 2013-01-17T13:37:02.220 に答える