簡體   English   中英

簡單光滑示例Scala

[英]Simple Slick Example Scala

我試圖用一個在Postgres中創建的表來練習一個簡單的光滑示例。它涉及4個文件。

這是我的DAO.scala文件

import slick.dbio.Effect.Write
import slick.lifted.{CanBeQueryCondition, Rep, Tag}
import slick.jdbc.PostgresProfile.api._
import slick.sql.FixedSqlAction

import scala.concurrent.Future
import scala.reflect._

trait BaseEntity {
  val id: Long
  val isDeleted: Boolean
}

abstract class BaseTable[E: ClassTag](tag: Tag, schemaName: Option[String], tableName: String)
  extends Table[E](tag, schemaName, tableName) {

  val classOfEntity = classTag[E].runtimeClass

  val id: Rep[Long] = column[Long]("Id", O.PrimaryKey, O.AutoInc)
  val isDeleted: Rep[Boolean] = column[Boolean]("IsDeleted", O.Default(false))
}

trait BaseRepositoryComponent[T <: BaseTable[E], E <: BaseEntity] {
  def getById(id: Long): Future[Option[E]]

  def getAll: Future[Seq[E]]

  def filter[C <: Rep[_]](expr: T => C)(implicit wt: CanBeQueryCondition[C]): Future[Seq[E]]

  def save(row: E): Future[E]

  def deleteById(id: Long): Future[Int]

  def updateById(id: Long, row: E): Future[Int]
}

trait BaseRepositoryQuery[T <: BaseTable[E], E <: BaseEntity] {

   val query: slick.jdbc.PostgresProfile.api.type#TableQuery[T]

  def getByIdQuery(id: Long): Query[T, E, Seq] = {
    query.filter(_.id === id).filter(_.isDeleted === false)
  }

  def getAllQuery: Query[T, E, Seq] = {
    query.filter(_.isDeleted === false)
  }

  def filterQuery[C <: Rep[_]](expr: T => C)(implicit wt:     CanBeQueryCondition[C]): Query[T, E, Seq] = {
    query.filter(expr).filter(_.isDeleted === false)
  }

  def saveQuery(row: E): FixedSqlAction[E, NoStream, Write] = {
    query returning query += row
  }

  def deleteByIdQuery(id: Long): FixedSqlAction[Int, NoStream, Write]={
query.filter(_.id === id).map(_.isDeleted).update(true)
  }

  def updateByIdQuery(id: Long, row: E): FixedSqlAction[Int, NoStream, Write] = {
    query.filter(_.id === id).filter(_.isDeleted === false).update(row)
  }

}

abstract class BaseRepository[T <: BaseTable[E], E <: BaseEntity :    ClassTag](clazz: TableQuery[T])
  extends BaseRepositoryQuery[T, E]
 with BaseRepositoryComponent[T, E] {
   val clazzTable: TableQuery[T] = clazz
  lazy val clazzEntity = classTag[E].runtimeClass
  val query: slick.jdbc.PostgresProfile.api.type#TableQuery[T] = clazz
  val user = "postgres"
  val url = "jdbc:postgresql://localhost:5432/learning"
  val password = "admin"
 val driver = "org.postgresql.Driver"


  val db = Database.forURL(url, user = user, password = password, driver = driver)

  def getAll: Future[Seq[E]] = {
    db.run(getAllQuery.result)
  }

  def getById(id: Long): Future[Option[E]] = {
    db.run(getByIdQuery(id).result.headOption)
  }

  def filter[C <: Rep[_]](expr: T => C)(implicit wt: CanBeQueryCondition[C]): Future[Seq[E]] = {
db.run(filterQuery(expr).result)
  }

  def save(row: E): Future[E] = {
    db.run(saveQuery(row))
  }

  def updateById(id: Long, row: E): Future[Int] = {
    db.run(updateByIdQuery(id, row))
  }

 def deleteById(id: Long): Future[Int] = {
    db.run(deleteByIdQuery(id))
  }

}

這是我的entities.scala文件

import slick.jdbc.PostgresProfile.api._
import slick.lifted.ProvenShape.proveShapeOf
import slick.lifted.{Rep, Tag}

class EmployeeTable(_tableTag: Tag) extends BaseTable[Employee]    (_tableTag, Some("learning"), "Employee") {

  def * = (id, firstName, isDeleted) <>(Employee.tupled,     Employee.unapply)

  def ? = (Rep.Some(id), Rep.Some(firstName),    Rep.Some(isDeleted)).shaped.<>({ r => import r._; _1.map(_ => Employee.tupled((_1.get, _2.get, _3.get))) }, (_: Any) => throw new Exception("Inserting into ? projection not supported."))

  override val id: Rep[Long] = column[Long]("EmployeeId", O.AutoInc, O.PrimaryKey)
  val firstName: Rep[String] = column[String]("FirstName")
  override val isDeleted: Rep[Boolean] = column[Boolean]("IsDeleted")
  lazy val employeeTable = new TableQuery(tag => new EmployeeTable(tag))

}


case class Employee(id: Long, firstName: String, isDeleted: Boolean)     extends BaseEntity

這是我的build.scala文件。

name := "SlickAkka"

version := "1.0"

scalaVersion := "2.12.0"

libraryDependencies ++= Seq(
   "com.typesafe.slick" % "slick_2.11" % "3.2.0-M1",
  "org.postgresql" % "postgresql" % "9.4.1211"
)

最后是我的EmployeeRepository.scala文件

import slick.lifted.TableQuery
import scala.concurrent.ExecutionContext.Implicits.global
abstract class EmployeeRepository
 extends  BaseRepository[EmployeeTable, Employee](TableQuery[EmployeeTable]){

   def insertItem(row: Employee) = {
       super.save(row)
   }

}

object ImplEmployeeRepository extends EmployeeRepository

object TestEmp extends App {

  val emp = Employee(0L, "aamir", false)

  for {
    result <- ImplEmployeeRepository.insertItem(emp)
    _ = println(result)
  } yield result
  Thread.sleep(5000)

}

一旦我運行'TestEmp'對象就會拋出此異常:

線程“main”中的異常java.lang.NoClassDefFoundError:sclick / Product $ class at slick.ast.ColumnOption $ PrimaryKey $。(ColumnOption.scala:15)at slick.ast.ColumnOption $ PrimaryKey $。(ColumnOption.scala)at at slick.relational.RelationalTableComponent $ ColumnOptions $ class。$ init $(RelationalProfile.scala:110)at slick.relational.RelationalTableComponent $$ anon $ 2.(RelationalProfile.scala:116)at slick.relational.RelationalTableComponent $ class。$ init $ (RelationalProfile.scala:116)at slick.jdbc.PostgresProfile $。(PostgresProfile.scala:245)atslick.jdbc.PostgresProfile $。(PostgresProfile.scala)at BaseRepository。(DAO.scala:78)at EmployeeRepository。(EmployeeRepository) .scala:3)位於ImplEmployeeRepository $。(EmployeeRepository.scala:11)的ImplEmployeeRepository $。(EmployeeRepository.scala)位於TestEmp $ .delayedEndpoint $ TestEmp $ 1(EmployeeRepository.scala:18)位於TestEmp $ delayedInit $ body.apply(EmployeeRepository) .scala:13)scala.runtime.AbstractFunction0.apply $ mcV $ sp(AbstractFunction0.scala:12)at scala.App。$ anonfun $ main $ 1 $ adapt(App.scala:76)at scala.App $$ Lambda $ 5 / 305808283.apply(Unknown Source)at scala.collection.immutable.List.foreach(List.scala:378)at scala.App .main(App.scala:76)位於sun.reflect.NativeMethodAccessorImpl的TestEmp.main(EmployeeRepository.scala)的testEmp $ .main(EmployeeRepository.scala:13)的scala.App.main $(App.scala:74) .invoke0(本機方法)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java) :497)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)引起:java.lang.ClassNotFoundException:java.net.URLClassLoader.findClass(URLClassLoader.java)中的scala.Product $ class :381)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:331)at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ......還有26個

我無法弄清楚究竟是什么問題?

您的Scala編譯器版本是2.12但您的光滑版本是2.11

將光滑版本更改為2.12或將Scala編譯器版本更改為2.11

name := "SlickAkka"

version := "1.0"

scalaVersion := "2.12.0"

libraryDependencies ++= Seq(
   "com.typesafe.slick" % "slick_2.11" % "3.2.0-M1", //error is here
  "org.postgresql" % "postgresql" % "9.4.1211"
)

更改了正確的build.sbt

name := "SlickAkka"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
   "com.typesafe.slick" % "slick_2.11" % "3.2.0-M1",
  "org.postgresql" % "postgresql" % "9.4.1211"
)

要么

name := "SlickAkka"

version := "1.0"

scalaVersion := "2.11.0"

libraryDependencies ++= Seq(
   "com.typesafe.slick" %% "slick" % "3.2.0-M1", //notice double %%
  "org.postgresql" % "postgresql" % "9.4.1211"
)

或者使用Scala編譯器2.12

name := "SlickAkka"

version := "1.0"

scalaVersion := "2.12.0"

libraryDependencies ++= Seq(
   "com.typesafe.slick" %% "slick" % "3.2.0-M1",
  "org.postgresql" % "postgresql" % "9.4.1211"
)

或Scala編譯器2.12

name := "SlickAkka"

version := "1.0"

scalaVersion := "2.12.0"

libraryDependencies ++= Seq(
   "com.typesafe.slick" % "slick_2.12" % "3.2.0-M1",
  "org.postgresql" % "postgresql" % "9.4.1211"
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM