Slick을 사용하여 다 대다 관계를 쿼리하려고하지만 다양한 오류가 발생합니다. 가장 눈에 띄는 것은 " T (사용자, 기술)을 풀고 G "로 포장하십시오.Scala Slick : groupBy 문제 및 모양 누락
테이블의 구조는 다음과 유사합니다 궁극적으로
case class User(val name: String, val picture: Option[URL], val id: Option[UUID])
object Users extends Table[User]("users") {
def name = column[String]("name")
def picture = column[Option[URL]]("picture")
def id = column[UUID]("id")
def * = name ~ picture ~ id.? <> (User, User.unapply _)
}
case class Skill(val name: String, val id: Option[UUID])
object Skills extends Table[Skill]("skill") {
def name = column[String]("name")
def id = column[UUID]("id")
def * = name ~ id.? <> (Skill, Skill.unapply _)
}
case class UserSkill(val userId: UUID, val skillId: UUID, val id: Option[UUID])
object UserSkills extends Table[UserSkill]("user_skill") {
def userId = column[UUID]("userId")
def skillId = column[UUID]("skillId")
def id = column[UUID]("id")
def * = userId ~ skillId ~ id.? <> (UserSkill, UserSkill.unapply _)
def user = foreignKey("userFK", userId, Users)(_.id)
def skill = foreignKey("skillFK", skillId, Skills)(_.id)
}
, 내가 무엇을 달성하고자하는 형태의 무언가이다
SELECT u.*, group_concat(s.name) FROM user_skill us, users u, skills s WHERE us.skillId = s.id && us.userId = u.id GROUP BY u.id
하지만 난려고 시간을 보내고 전에 group_concat도 잘 작동하도록 간단한 쿼리를 생성하려고 노력해 왔습니다. (여전히 유효하다고 생각합니다 ...)
SELECT u.* FROM user_skill us, users u, skills s WHERE us.skillId = s.id && us.userId = u.id GROUP BY u.id
내가이 쿼리를 생성하는 스칼라 코드의 다양한 시도했지만, 형상 오류 위의 원인이 무엇의 예는 유사
(for {
us <- UserSkills
user <- us.user
skill <- us.skill
} yield (user, skill)).groupBy(_._1.id).map { case(_, xs) => xs.first }
이며, 다음은 (""사용자 "에 대한 대신 포장 오류가 발생합니다 오늘과 어제 수색 구글/구글 그룹뿐만 아니라 매끄러운 소스의 대부분을 지출했습니다,하지만 난하지 않은 : 사람이 어떤 제안이있는 경우 사용자, 스킬) "
(for {
us <- UserSkills
user <- us.user
skill <- us.skill
} yield (user, skill)).groupBy(_._1.id).map { case(_, xs) => xs.map(_._1).first }
, 나는 매우 감사하게 될 것입니다 해결책은 아직 없습니다.
(GROUP_CONCAT 실제로 string_agg 것, 그래서 또한, 나는 postgre을 사용하고 있습니다)
편집
그래서 GROUPBY를 사용하는 경우, 매핑 된 돌출부가 있기 때문에 적용됩니다 것 같아 뭔가
같은(for {
us <- UserSkills
u <- us.user
s <- us.skill
} yield (u,s)).map(_._1)
은 _._1이 사용자 유형을 제공하므로 잘 작동합니다. 사용자는 표 형식이므로 모양이 있습니다. 그러나 xs.first를 호출하면 (groupBy를 호출 할 때와 마찬가지로) 매핑 된 투영 유형 (User, Skill)을 실제로 얻거나 map (_._1)을 먼저 적용하면 User, 어떤 사용자가 아닙니다! 내가 말할 수있는 한 Shape [Column [T], T, Column [T]]와 테이블 T <에 대해서만 정의 된 모양이 있기 때문에 혼합 유형으로 User는 모양이 없습니다. TableNode, Shape [T , NothingContainer # TableNothing, T] slick.lifted.Shape에 정의 된대로. 내가
(for {
us <- UserSkills
u <- us.user
s <- us.skill
} yield (u,s))
.groupBy(_._1.id)
.map { case (_, xs) => xs.map(_._1.id).first }
뭔가를 할 경우 또한, 나는 형태의 이상한 오류 얻을 "키를 찾을 수 없습니다 예외 : NoSuchElementException을 1515100893 @", 숫자 키 값마다 변경 곳. 이것은 내가 원하는 쿼리가 아니지만 그다지 이상한 문제는 아닙니다.
여러 테이블에 가입해야하는 상황에서 직접 쿼리를 작성했습니다. 그건 그렇고, 더 나은 공연 변종 (u.id, s.id, us.userId 및 us.skillId 키 제공)은 "SELECT u. *, group_concat (s.name) FROM user_skill us JOIN skills s ON us.skillId = s.id 사용자가 u.id에 가입하십시오 .userId = u.id GROUP BY u.id " – Ashalynd
하지만 어쨌든, 그룹화하면 맵 (id -> List ((u, s))을 얻을 수 있습니다. {case} 표현식에 정확히 어떻게 기술되어있는지는 아닙니다. – Ashalynd