首页 文章

Slick 3.0使用过滤器查询数据

提问于
浏览
0

我有一个案例类如下:

case class PowerPlantFilter(
  powerPlantType: Option[PowerPlantType],
  powerPlantName: Option[String],
  orgName: Option[String],
  page: Int,
  onlyActive: Boolean
)

我的表映射如下所示:

class PowerPlantTable(tag: Tag) extends Table[PowerPlantRow](tag, "powerPlant") {
    def id            = column[Int]("powerPlantId", O.PrimaryKey)
    def orgName       = column[String]("orgName")
    def isActive      = column[Boolean]("isActive")
    def minPower      = column[Double]("minPower")
    def maxPower      = column[Double]("maxPower")
    def powerRampRate = column[Option[Double]]("rampRate")
    def rampRateSecs  = column[Option[Long]]("rampRateSecs")
    def powerPlantType= column[PowerPlantType]("powerPlantType")
    def createdAt     = column[DateTime]("createdAt")
    def updatedAt     = column[DateTime]("updatedAt")

    def * = {
      (id, orgName, isActive, minPower, maxPower,
        powerRampRate, rampRateSecs, powerPlantType, createdAt, updatedAt) <>
        (PowerPlantRow.tupled, PowerPlantRow.unapply)
    }
  }

我想查看过滤器并填充动态查询!另外,我想在生成的SQL类型中使用like语句 .

所以在我的情况下,我的PowerPlantFilter中的orgName应该检查是否存在,如果是,它应该在生成的SQL中生成一个like语句!

这是我的第一次尝试,但显然失败了!

val q4 = all.filter { powerPlantTable =>
    List(
      criteriaPowerPlantType.map(powerPlantTable.powerPlantType === _),
      criteriaOrgName.map(powerPlantTable.orgName like s"%${criteriaOrgName}%") // fails to compile here!
    ).collect({case Some(criteria)  => criteria}).reduceLeftOption(_ && _)
  }

Slick中有没有内置的东西可以做到这一点?

1 回答

  • 0

    这就是我到达并且它有效,但不确定这是否有效:

    def powerPlantsFor(criteriaPowerPlantType: Option[PowerPlantType], criteriaOrgName: Option[String], onlyActive: Boolean) = {
      val query = for {
        filtered <- all.filter(f =>
          criteriaPowerPlantType.map(d =>
            f.powerPlantType === d).getOrElse(slick.lifted.LiteralColumn(true)) &&
            criteriaOrgName.map(a =>
              f.orgName like s"%$a%").getOrElse(slick.lifted.LiteralColumn(true))
        )
      } yield filtered
    
      query.filter(_.isActive === onlyActive)
    }
    

    但是当我检查生成的SQL查询时,我看到在数据库上执行的两个语句如下:

    [debug] s.j.J.statement - Preparing statement: select `powerPlantId`, `orgName`, `isActive`, `minPower`, `maxPower`, `rampRate`, `rampRateSecs`, `powerPlantType`, `createdAt`, `updatedAt` from `powerPlant` where (true and (`orgName` like '%Organization-%')) and (`isActive` = true) limit 0,5
    [debug] s.j.J.statement - Preparing statement: select `powerPlantId`, `orgName`, `isActive`, `minPower`, `maxPower`, `rampRate`, `rampRateSecs`, `powerPlantType`, `createdAt`, `updatedAt` from `powerPlant` where `isActive` = true
    

    我该如何优化?

相关问题