3

Query(query.length).first同じ名前の複数の列を持つ 2 つのテーブルの結合を表すクエリを実行しようとすると、不正な形式の SQL が表示されます。例を考えてみましょう:

// in Main.scala
import scala.slick.driver.MySQLDriver.simple._
object Main extends App {

  object Houses extends Table[Long]("Houses") {
    def id = column[Long]("id")
    def * = id
  }
  object Rooms extends Table[(Long, Long)]("Rooms") {
    def id = column[Long]("id")
    def houseId = column[Long]("houseId")
    def * = id ~ houseId
  }

  val query = for {
    h <- Houses
    r <- Rooms
    if h.id === r.houseId
  } yield (h, r)
  println("QUERY: " + Query(query.length).selectStatement)
}

// in build.sbt
scalaVersion := "2.10.2"

libraryDependencies += "com.typesafe.slick" %% "slick" % "1.0.1"

この例では、次の SQL が生成されます。

select x2.x3 from
  (select count(1) as x3 from 
    (select x4.`id`, x5.`id`, x5.`houseId` 
     from `Houses` x4, `Rooms` x5 where x4.`id` = x5.`houseId`) x6) x2

これは明らかに間違っており、id列が部分的に重複しているため、MySQL によって拒否されますselect x4.id, x5.id

私は次のことを試みることができました:

query.list.size

しかし、それはクエリからすべての行を抽出してネットワーク経由で送信するため、パフォーマンスが大幅に低下します。

私は何を間違っていますか?それを修正する方法はありますか?

4

1 に答える 1