1

したがって、同じテーブルを指す 2 つの FK を持つ 1 つのテーブルがあります。

例えば:

送信者列と受信者列があり、どちらもユーザー テーブルの ID を参照するメッセージ テーブル。

メッセージを取得して両方に結合するためのクエリを書いているとき、最初の結果は両方に同じように使用されます。

これが私がそれをやろうとしている方法です。

import scalikejdbc._

Class.forName("org.h2.Driver")
ConnectionPool.singleton("jdbc:h2:mem:hello", "user", "pass")

implicit val session = AutoSession

sql"""
create table members (
  id serial not null primary key,
  name varchar(64),
  created_at timestamp not null
)
""".execute.apply()

sql"""
create table message (
  id serial not null primary key,
  msg varchar(64) not null,
  sender int not null,
  receiver int not null
)
""".execute.apply()

Seq("Alice", "Bob", "Chris") foreach { name =>
  sql"insert into members (name, created_at) values (${name}, current_timestamp)".update.apply()
}

Seq(
    ("msg1", 1, 2),
    ("msg2", 1, 3),
    ("msg3", 2, 1)
) foreach { case (m, s, r) =>
  sql"insert into message (msg, sender, receiver) values (${m}, ${s}, ${r})".update.apply()
}

import org.joda.time._
case class Member(id: Long, name: Option[String], createdAt: DateTime)
object Member extends SQLSyntaxSupport[Member] {
  override val tableName = "members"
  def apply(mem: ResultName[Member])(rs: WrappedResultSet): Member = new Member(
    rs.long("id"), rs.stringOpt("name"), rs.jodaDateTime("created_at"))
}

case class Message(id: Long, msg: String, sender: Member, receiver: Member)
object Message extends SQLSyntaxSupport[Message] {
    override val tableName = "message"
  def apply(ms: ResultName[Message], s: ResultName[Member], r: ResultName[Member])(rs: WrappedResultSet): Message = new Message(
    rs.long("id"), rs.string("msg"), Member(s)(rs), Member(r)(rs))
}

val mem = Member.syntax("m")
val s = Member.syntax("s")
val r = Member.syntax("r")
val ms = Message.syntax("ms")
val msgs: List[Message] = sql"""
  select * 
  from ${Message.as(ms)}
  join ${Member.as(s)} on ${ms.sender} = ${s.id}
  join ${Member.as(r)} on ${ms.receiver} = ${r.id}
  """.map(rs => Message(ms.resultName, s.resultName, r.resultName)(rs)).list.apply()

私は何か間違ったことをしていますか、それともバグですか?

4

1 に答える 1

0

返事が遅れて申し訳ありません。Google Group ML があり、グループからの通知を積極的に読んでいます。

お急ぎの場合は、stackoverflow の URL を投稿してください。https://groups.google.com/forum/#!forum/scalikejdbc-users-group

この場合、select ${ms.result.*}, ${s.result.*}の代わりに書く必要がありますselect *。詳しくはこちらのページをお読みください。http://scalikejdbc.org/documentation/sql-interpolation.html

于 2015-03-26T09:45:13.183 に答える