标签: scalaquery

在Slick中根据Id选择单行

我想根据Id查询用户的单行.我有以下虚拟代码

case class User(
    id: Option[Int], 
    name: String
}

object Users extends Table[User]("user") {
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def * = id ~ name <>(User, User.unapply _)

  def findById(userId: Int)(implicit session: Session): Option[User] = {
    val user = this.map { e => e }.where(u => u.id === userId).take(1)
    val usrList = user.list
    if (usrList.isEmpty) None
    else Some(usrList(0))
  }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,findById查询单个列是一种过度杀伤,因为Id是标准主键.有谁知道更好的方法?请注意我正在使用Play!2.1.0

scala scalaquery slick

12
推荐指数
2
解决办法
1万
查看次数

与LINQ一样的Scala集合式SQL支持

据我所知,LINQ支持的唯一内容是Scala目前不支持其集合库,它是与SQL数据库的集成.

据我了解LINQ可以"收集"各种操作和查询到那里处理它的时候可以给"整"语句到数据库,防止一个简单的SELECT第一张全表到虚拟机的数据结构.

如果我错了,我会很乐意纠正.

如果没有,在Scala中支持相同的内容是什么?

是不是可以编写一个实现集合接口的库,但是没有任何数据结构支持它,但是一个String,它将后续集合组装到所需的Database语句中?

或者我的观察完全错了?

c# linq database scala scalaquery

11
推荐指数
3
解决办法
1556
查看次数

如何使用ScalaQuery进行分页查询?

我有一个查询返回Person我正用于从数据库中获取一页结果的对象:

def page(pageNumber:Int, pageSize:Int) : Seq[Person] = database.withSession {
  val query = for(person <- People) yield person.mapped
  val startIndex = (pageNumber - 1) * pageSize
  query.list.slice(startIndex, startIndex + pageSize)
}
Run Code Online (Sandbox Code Playgroud)

这有效,但我想知道我是否可以在数据库中进行分页,方法与javax.persistence.QueryAPI setFirstResultsetMaxResults方法相同,而不是slice在结果列表中使用.

scala scalaquery

11
推荐指数
1
解决办法
2375
查看次数

根据ScalaQuery/SLICK中列的MAX值选择行

说我有这样的表:

UserActions
    UserId INT
    ActionDate TIMESTAMP
    Description TEXT
Run Code Online (Sandbox Code Playgroud)

包含用户执行某些行为的日期.如果我想获得每个用户执行的最后一个操作,我将不得不在SQL中执行以下操作:

SELECT *
FROM   UserActions,
       (
           SELECT ua.UserId,
                  max(ua.ActionDate) AS lastActionDate
           FROM   UserActions ua
           GROUP BY ua.UserId
       ) AS lastActionDateWithUserId
WHERE  UserActions.UserId = lastActionDateWithUserId.UserId 
  AND  UserActions.ActionDate = lastActionDateWithUserId.lastActionDate
Run Code Online (Sandbox Code Playgroud)

现在,假设我已经在scalaquery 0.9.5中为UserActions设置了表结构,例如:

case class UserAction(userId:Int,actionDate:Timestamp,description:String)

object UserActions extends BasicTable[UserAction]("UserActions"){

    def userId = column[Int]("UserId")

    def actionDate = column[Timestamp]("ActionDate")

    def description  = column[String]("Description")

    def * = userId ~ actionDate ~ description <> (UserAction, UserAction.unapply _)
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:在ScalaQuery/SLICK中我该如何执行这样的查询?

scala subquery max scalaquery slick

11
推荐指数
1
解决办法
3853
查看次数

如何使用Slick使用过滤器计算结果?

我想面对一个我想简化的问题:(很确定,事实上我做错了).

通缉

我想计算id = 1的用户数.在SQL语言中,让我们说它是这样的:

SELECT COUNT(*) FROM users WHERE id = 1
Run Code Online (Sandbox Code Playgroud)

我正在使用Slick的"提升"形式,所以这是我的一段代码计算用户:

Query(Users.where( _.id === 1).length).first
Run Code Online (Sandbox Code Playgroud)

实际上,这里发生的是Slick别名ScalaQuery,实际上是使用过滤器原因创建子查询,然后计算子请求的结果.

SELECT COUNT(*) FROM (SELECT * FROM users WHERE id = 1))
Run Code Online (Sandbox Code Playgroud)

对于这样的查询来说似乎是相当大的开销.

scala scalaquery playframework-2.0 slick

11
推荐指数
1
解决办法
4760
查看次数

Scala Slick/ScalaQuery BigDecimal创建十进制(10,0)如何允许小数?

如何告诉Slick创建允许小数的十进制SQL类型?
似乎默认情况下Slick不允许使用下面的代码注意到小数.它decimal(10,0)在MySQL中创建一个具有数据类型的列.

我的Scala代码中有以下模型:

import scala.slick.driver.MySQLDriver.simple._

case class TimeType(id: Option[Int], name: String,
  employeeMultiplier: BigDecimal, employerMultiplier: BigDecimal)

object TimeTypes extends Table[TimeType]("timeType") {
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def employeeMultiplier = column[BigDecimal]("employeeMultiplier")
  def employerMultiplier = column[BigDecimal]("employerMultiplier")
  def * = id.? ~ name ~ employeeMultiplier ~ employerMultiplier <> (TimeType, TimeType.unapply _)
}
Run Code Online (Sandbox Code Playgroud)

在启动期间,我使用Slick创建此表,除非它已存在此代码

...
lazy val database = Database.forDataSource(DB.getDataSource())

database.withSession {
  if (MTable.getTables("timeType").list.isEmpty) {
    TimeTypes.ddl.create
    ...
Run Code Online (Sandbox Code Playgroud)

database scala scalaquery playframework-2.0 slick

11
推荐指数
1
解决办法
1749
查看次数

如何在select子句中编写嵌套查询

我正在尝试使用SLICK 1.0.0生成此SQL:

    select
    cat.categoryId,
    cat.title,
    (
      select
        count(product.productId)
      from
        products product
        right join products_categories productCategory on productCategory.productId = product.productId
        right join categories c on c.categoryId = productCategory.categoryId
      where
        c.leftValue >= cat.leftValue and
        c.rightValue <= cat.rightValue
    ) as productCount
from
    categories cat
where
    cat.parentCategoryId = 2;
Run Code Online (Sandbox Code Playgroud)

我最成功的尝试是(我删除了"连接"部分,因此它更具可读性):

def subQuery(c: CategoriesTable.type) = (for {
        p <- ProductsTable

      } yield(p.id.count))
      for {
        c <- CategoriesTable
        if (c.parentId === 2)
      } yield(c.id, c.title, (subQuery(c).asColumn))
Run Code Online (Sandbox Code Playgroud)

这会在子查询中产生缺少括号的SQL:

   select 
    x2.categoryId, 
    x2.title, 
    select count(x3.productId) from products x3 
   from …
Run Code Online (Sandbox Code Playgroud)

scala scalaquery slick

11
推荐指数
1
解决办法
5010
查看次数

SLICK 3.0 - 多个查询相互依赖 - db.run(action)

我是Slick 3的新手,到目前为止我已经理解db.run是异步调用.返回Future后运行.map或.flatMap.

我的代码中的问题是所有子查询都不起作用(嵌套db.run).

从概念上讲,我没有得到什么?这样的代码是否有效,如下所示?基本上在第一个查询的.map中我根据第一个查询执行一些操作.

我到处都看到有产量的循环,它是唯一的出路吗?我的代码中的问题是否与返回的Future值有关?

val enterprises = TableQuery[Enterprise]
val salaries = TableQuery[Salary]

//Check if entered enterprise exists 
val enterpriseQS = enterprises.filter(p => p.name.toUpperCase.trim === salaryItem.enterpriseName.toUpperCase.trim).result

val result=db.run(enterpriseQS.headOption).map(_ match 
{
    case Some(n) => {
      //if an enterprise exists use the ID from enterprise (n.id) when adding a record to salary table
      val addSalary1 = salaries += new SalaryRow(0, n.id, salaryItem.worker)
      db.run(addSalary1)
    }
    case None =>  {
        //if an enterprise with salaryItem.enterpriseName doesn't exist, a new enterprise is inserted …
Run Code Online (Sandbox Code Playgroud)

scala scalaquery slick slick-3.0

11
推荐指数
1
解决办法
4908
查看次数

迭代任意长度的元组

我刚开始使用Scala并遇到了一个问题:

Scala有类型的Tuple1,Tuple2,..., Tuple22.在迭代查询时,Scalaquery返回元组.

我现在有一个给定的类(ZK ListitemRenderer),它接受Objects并用行填充gui列表,每个行包含一些单元格.但ListitemRenderer不是通用的.所以我的问题是我有一个Object"数据",它实际上是一个任意长度的元组,我必须迭代创建单元格(简单地用data._1.toString,...).

以来 没有 我不知道超类型Tuple1-22,我不能 不能做到的data.asInstanceOf[Tuple].productIterator foreach {…}

我能做什么?


下面的答案告诉我,所有元组确实都有一个特征Product- 提供所需的foreach功能.

iterable scala tuples scalaquery

10
推荐指数
1
解决办法
2436
查看次数

如何从运行时参数指定SLICK Query sortBy列?

我有以下SLICK查询来获取数据表的分页结果,其名称字段与某些值条件匹配,并按名称列排序

val q = ThirdParties.where(_.name like criteria).sortBy(_.name.asc.nullsLast).drop(offset).take(pageSize)
val thirdParties = (for(s <-q) yield(s)).list map { case t: ThirdParty => t }
Run Code Online (Sandbox Code Playgroud)

这对我来说没问题,但是现在我需要能够将运行时参数传递给sortBy方法,该方法标识要执行排序的列.
我调用查询的方法将有一个int,表示数据表中列的索引.

我怎样才能从int列索引获取sortBy方法所需的必要类型?

scala scalaquery slick

10
推荐指数
1
解决办法
7342
查看次数

标签 统计

scala ×10

scalaquery ×10

slick ×7

database ×2

playframework-2.0 ×2

c# ×1

iterable ×1

linq ×1

max ×1

slick-3.0 ×1

subquery ×1

tuples ×1