Как сделать объединение запроса двух разных объектов в Slick? - PullRequest
0 голосов
/ 22 октября 2018

Я хочу сделать запрос, который объединяет список двух разных сущностей в один список.

Я планировал использовать параметры:

// +------+---------+---------+
// | size | Some(a) | None    |
// | size | None    | Some(b) |
// +------+---------+---------+

val queryA = TableQuery[TableA].map { a => 
  (a.size, Rep.Some(a), Rep.None[TableB]) 
}

val queryB = TableQuery[TableB].map { b => 
  (b.size, Rep.None[TableA], Rep.Some(b)) 
}

val union = (queryA ++ queryB)

Однако это не работает,Rep.None не поддерживает многостолбцовые значения, и компилятор пропускает TypedType[TableA] и TypedType[TableB].

Предложения?

1 Ответ

0 голосов
/ 31 октября 2018

Я решил это, создав объединение столбцов id только сначала, а затем присоединившись к таблицам.Далеко не оптимально, но работает.Все еще ищу лучшее решение.

// +------+------------+------------+
// | size | Some(a.id) | None       |
// | size | None       | Some(b.id) |
// +------+------------+------------+

val queryIdA = TableQuery[TableA].map { a => 
  (a.size, Rep.Some(a.id), Rep.None[TableB]) 
}

val queryIdB = TableQuery[TableB].map { b => 
  (b.size, Rep.None[TableA], Rep.Some(b.id)) 
}

val union = (queryIdA ++ queryIdB).sortBy { case (size, _, _) => size.desc }
  .joinLeft(TableQuery[TableA]).on { case ((_, aid, _), a) => aid.nonEmpty && aid === a.id }
  .joinLeft(TableQuery[TableB]).on { case (((_, _, bid), _), b) => bid.nonEmpty && bid === b.id }
  .map { case (((_, _, _), a), b) => (a, b) }
...