我试着用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中出现异常:scala/Product$class
在slick.ast.columnpoption$PrimaryKey$。(columnpoption.scala:15)
在slick.ast.columnpoption$PrimaryKey$(columnpoption.scala)
在slick.relational.RelationalTableComponent$ColumnOptions$class.$init$(RelationalProfile.scala:110)
位于slick.relational.RelationalTableComponent$$anon$2。(RelationalProfile.scala:116)
在slick.relational.RelationalTableComponent$class.$init$(RelationalProfile.scala:116)
在slick.jdbc.PostgresProfile$(PostgresProfile.scala:245)
在slick.jdbc.PostgresProfile$(PostgresProfile.scala)
在BaseRepository。(DAO.scala:78)
在雇主储蓄所
在雇主帐户$(雇主帐户。scala:11)
在雇主帐户$(EmployeeRepository.scala)
在TestEmp$.delayedEndpoint$TestEmp$1(EmployeeRepository.scala:18)
在TestEmp$delayediit$body.apply上(EmployeeRepository.scala:13)
在scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
在scala.App.$anonfun$main$1$改编(App.scala:76)
在scala.App$$Lambda$5/305808283.apply(未知来源)
在scala.collection.immutable.List.foreach(List.scala:378)
在scala.App.main(App.scala:76)
在scala.App.main$(App.scala:74)
在TestEmp$.main(EmployeeRepository.scala:13)
在TestEmp.main(EmployeeRepository.scala)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在sun.reflect.NativeMethodAccessorImpl.invoke上(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke上(DelegatingMethodAccessorImpl.java:43)
在java.lang.reflect.Method.invoke上(Method.java:497)
在com.intellij.rt.execution.application.AppMain.main上(AppMain.java:144)
原因:java.lang.ClassNotFoundException:scala.Product$class
在java.net.URLClassLoader.findClass上(URLClassLoader.java:381)
在java.lang.ClassLoader.loadClass上(ClassLoader.java:424)
在sun.misc.Launcher$AppClassLoader.loadClass上(Launcher.java:331)
在java.lang.ClassLoader.loadClass上(ClassLoader.java:357)
... 还有26个
我搞不清楚到底是什么问题??
最佳答案
Scala编译器的版本是2.12
,而光滑的版本是2.11
。
将slick版本更改为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"
)
关于postgresql - 简单的光滑示例Scala,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40420250/