代码之家  ›  专栏  ›  技术社区  ›  mortonrj

Slick有没有办法接受动态查询大小?

  •  2
  • mortonrj  · 技术社区  · 9 年前

    我试图用slick进行查询,其中一个参数是查询返回的元素数(通常通过将参数传递给“.take”来实现)。然而,我希望这个参数是可选的(寻找像.maybeFilter这样的命令,但寻找.take),我已经到处找了,但似乎找不到它。有人有什么建议吗?

    2 回复  |  直到 9 年前
        1
  •  0
  •   Timo Salomäki    9 年前

    动态查询筛选器 slick-doc

    def selectByHotelIdAndStartTimeAndEndTimeAndPerpageAndOffset(
          hotelId: Option[String],
          caseTimeFilter: Option[CaseTimeFilter[Timestamp]],
          perPage: Int,
          offset: Int
      ): Future[Seq[GoodsOrderMstinfoTRow]] =
        db.run(
          tableQ
            .filter { goodsOrderMstinfoT: GoodsOrderMstinfoT =>
              List(
                hotelId.map(goodsOrderMstinfoT.hotelid === _),
                caseTimeFilter.map(t => goodsOrderMstinfoT.createTime between (t.start, t.end))
              ).collect({ case Some(repBoolean) => repBoolean })
                .reduceLeftOption(_ && _)
                .getOrElse(true: Rep[Boolean])
            }
            .drop(offset)
            .take(perPage)
            .sortBy(_.gomtId.desc)
            .result
        )
    

    2.第二种方式

    def selectCountByHotelIdAndStartTimeAndEndTime(
          optionHotelId: Option[String],
          rmiSerialno: Option[String],
          caseTimeFilter: Option[CaseTimeFilter[Timestamp]]
      ): Future[Int] =
        db.run(
          tableQ
            .filter { RoomReviewT: RoomReviewT =>
              optionHotelId match {
                case Some(hotelid) => RoomReviewT.hotelid === hotelid
                case None          => true: Rep[Boolean]
              }
            }
            .filter { RoomReviewT: RoomReviewT =>
              rmiSerialno match {
                case Some(rmiSerialNo) => RoomReviewT.rmiSerialno === rmiSerialNo
                case None              => true: Rep[Boolean]
              }
            }
            .filter { RoomReviewT: RoomReviewT =>
              caseTimeFilter match {
                case Some(timeFilter) =>
                  RoomReviewT.createTime between (timeFilter.start, timeFilter.end)
                case None => true: Rep[Boolean]
              }
            }
            .length
            .result
        )
    

    `

        2
  •  0
  •   Richard Dallaway    9 年前

    take 使用常规 Option

    def query(taking: Option[Int]) = {
      val baseQuery = table.filter(...).map(...)
      taking.map(size => baseQuery.take(size)) getOrElse baseQuery
    }
    

    MaybeFilter .