在一对多中,"where exists"如何用slick表示?

In one-to-many, how to express "where exists" in slick?

让我们假设有两个表:

Cat 有一个 id 并且 Personality_Trait 有一个 id 和一个字符串 trait.

例如

== Cat ==
id  |  name
---------------
0   |  Tom
1   |  Garfield
2   |  Kitty

== Personality_Trait ===
id  |  trait
---------------
0   |  stubborn
1   |  stubborn
1   |  sleepy
1   |  moody
2   |  sleepy
2   |  moody

我如何获得至少具有我感兴趣的所有特征的所有猫?

例如当我在寻找 stubbornmoody

时,如何获得 Garfield

我在想类似的东西

Personality_Trait.groupBy(_.id).filter {
  case (id, traits) => <predicate on traits>
}.map(_._1)

我认为首先你应该将 Personality_Trait 从 (id, trait) 翻译成 tempRecord (id,seq[trait]) 然后做谓词。

我找到了一个解决方案,虽然不优雅且可能效率低下:

val desiredTraits = Set("stubborn", "moody")

(for {
  catId <- Personality_Trait.filter(_.trait inSetBind desiredTraits)
             .groupBy(_.id).map { case (txnId, foundTraits) =>
               (txnId, foundTraits.length)
             }.filter { case (txnId, foundTraitCount) =>
               foundTraitCount >= desiredTraits.size
             }.map(_._1)
  cat <- Cat if cat.id === catId
} yield (cat)).result