쿼리에서 Query(query.length).first
을 실행하려고하면 동일한 이름의 여러 열이있는 2 개의 테이블이 조인됩니다. 잘못된 형식의 SQL이 나타납니다. 예를 생각해Slick에서 조인에 의해 반환 된 행 수는 어떻게 계산합니까?
// 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을 생성합니다 명확하게 잘못하고 id
열이 select x4.id, x5.id
일부를 복제하기 때문에 MySQL이 거부
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
합니다.
query.list.size
을하지만 쿼리에서 모든 행을 추출하여 성능을 크게 방해하는 것입니다 와이어, 이상을 보내드립니다 :
나는 다음을 수행을 시도 할 수 있습니다.
내가 뭘 잘못하고 있니? 그것을 고칠 수있는 방법이 있습니까?
실제로 작동합니다. 나는 일반적인'Query [A, B]'의 경우에 해결책이 존재하기를 바란다. 왜냐하면 그것은 코드의 복잡함을 줄이기 때문이다. (현재의 해결책은 모든 쿼리에 대해 코드를 손으로 쓸 것을 요구한다.) 그러나 일반적인 해결책이 가능한 방법을 알지 못하기 때문에 이것이 유일한 방법입니다. – Rogach
@Rogach, 귀하의 의견에 대한 답변으로 답변에 대한 자세한 내용을 추가했습니다. – cmbaxter
감사합니다. 그러나 나는 다른 것을 의미했다. 예를 들어, 쿼리에서 물건을 가져오고, 제한값을 적용하고, 쿼리 개체를 계산하는 도우미 메서드 인'runApiQuery [A, B] (query : Query [A, B])' 올바르게''runApiQuery' 호출자에게 부담을주지 않으면 서'query.length'를 메서드 내에서 수행 할 수 있습니다. (그리고 Slick 팀은 벌써 6 일 동안 버그를 주석 처리하지 않았기 때문에 곧 그렇게되지는 않을 것입니다).현재 runApiQuery : runApiQuery [A, B, C] (q : Query [A, B]) (countCol : A => Column [C])에 매개 변수를 추가하고 나중에 신체. – Rogach