슬릭 2 를 사용하여 관계형 교차점 또는 차이를 얻을 수 있습니까?
-
22-12-2019 - |
문제
나는 그것을 사용하고 있습니다.나는 두 가지가있는 경우 Query
같은 유형의 관계를 나타내는,나는 거기 참조 union
그러나 나는 그들의 교차점이나 그들의 차이를 얻기 위해 비교 가능한 연산자를 보지 못한다.이러한 연산자는 슬릭에 존재하지 않는?
나는 전술 한 것이 내가 찾고있는 것을 설명한다고 생각하지만,그렇지 않다면 여기에 예가 있습니다.나는 공급자 테이블을 가지고있다:
case class Supplier(snum: String, sname: String, status: Int, city: String)
class Suppliers(tag: Tag) extends Table[Supplier](tag, "suppliers") {
def snum = column[String]("snum")
def sname = column[String]("sname")
def status = column[Int]("status")
def city = column[String]("city")
def * = (snum, sname, status, city) <> (Supplier.tupled, Supplier.unapply _)
}
val suppliers = TableQuery[Suppliers]
특정 도시에 있거나 특정 지위를 가진 공급 업체에 대해 알고 싶다면 사용 방법을 참조하십시오 Query.union
그것을 위해:
scala> val thirtySuppliers = suppliers.filter(_.status === 30)
thirtySuppliers: scala.slick.lifted.Query[Suppliers,Suppliers#TableElementType] = scala.slick.lifted.WrappingQuery@166f63a
scala> val londonSuppliers = suppliers.filter(_.city === "London")
londonSuppliers: scala.slick.lifted.Query[Suppliers,Suppliers#TableElementType] = scala.slick.lifted.WrappingQuery@1bea855
scala> (thirtySuppliers union londonSuppliers).foreach(println)
Supplier(S1,Smith,20,London)
Supplier(S4,Clark,20,London)
Supplier(S3,Blake,30,Paris)
Supplier(S5,Adams,30,Athens)
문제 없습니다.하지만 난 단지 공급 업체를 원하는 경우 둘 다 특정 도시 그리고 특정 상태가 있습니까?내가 뭔가를 할 수 있어야하는 것처럼 보인다:
(thirtySuppliers intersect londonSuppliers).foreach(println)
또는 특정 도시에 공급자를 원하는 경우 제외 특정한 지위를 가진 사람들.나는 같은 일을 할 수 없다:
(thirtySuppliers except londonSuppliers).foreach(println)
이 UNION
, INTERSECT
,그리고 EXCEPT
운영 및 슬릭의 Query
클래스는 union
쿼리를 빌드하는 메서드 UNION
,그러나 나는 보지 않고있다 Query
교차점이나 차이를 유도하기위한 슬릭의 방법.나는 그들을 놓치고 있습니까?
해결책
이를 구현하는 풀 요청이 있습니다.그것은 2.0 또는 2.1 로 만들 것입니다. https://github.com/slick/slick/pull/242 우리는 여전히 몇 가지 세부 사항을 파악하고 조금 정리해야합니다.
다른 팁
이 연산은 교차점이 두 개의 필터가 될 수 있다는 점에서 거의 구성 가능합니다.예를 들어
val intersect = suppliers.filter(_.status === 30).filter(_.city === "London")
또는 제외:
val except= suppliers.filter(_.city === "London").filterNot(_.status === 30)