簡體   English   中英

如何在Scala中使用Anorm將查詢結果映射到案例類

[英]How to map a query result to case class using Anorm in scala

我有2個案例類,例如:

case class ClassTeacherWrapper(
                          success: Boolean,
                          classes: List[ClassTeacher]
                        )

第二個:

case class ClassTeacher(
                      clid: String,
                      name: String
                    )

和這樣的查詢:

  val query =
    SQL"""
      SELECT
        s.section_sk::text AS clid,
         s.name AS name
         from
       ********************
    """

出於安全考慮,我將*替換為查詢:

所以我的查詢返回2個值。 我如何將其映射到case class ClassTeacher

目前我正在做這樣的事情:

def getClassTeachersByInstructor(instructor: String, section: String): ClassTeacherWrapper = {

implicit var conn: Connection = null
try {

  conn = datamartDatasourceConnectionPool.getDBConnection()
  // Define query
  val query =
    SQL"""
      SELECT
        s.section_sk::text AS clid,
         s.name AS name
       ********
    """



  logger.info("Read from DB: " + query)


  // create a List containing all the datasets from the resultset and return
  new ClassTeacherWrapper(
       success =true,
      query.as(Macro.namedParser[ClassTeacher].*)

  )
  //Trying new approch
  //val users = query.map(user => new ClassTeacherWrapper(true, user[Int]("clid"), user[String]("name")).tolist
}
catch {
  case NonFatal(e) =>
    logger.error("getGradebookScores: error getting/parsing data from DB", e)
    throw e
  }
}

我正在得到這個異常:

{
   "error": "ERROR: operator does not exist: uuid = character varying\n  
    Hint: No operator matches the given name and argument type(s). You 
    might need to add explicit type casts.\n  Position: 324"
 }

任何人都可以幫我解決問題。 我是scala和Anorm的新手,我應該在query.as修改什么作為代碼的一部分

您需要成功領域嗎? 通常,空列表就足夠了嗎?

我發現解析器非常有用(並且可重用),因此在ClassTeacher單例(或類似位置)中類似以下內容:

val fields = "s.section_sk::text AS clid, s.name"

val classTeacherP =
  get[Int]("clid") ~
  get[String]("name") map {
    case clid ~ name =>
    ClassTeacher(clid,name)
  }

def allForInstructorSection(instructor: String, section: String):List[ClassTeacher] = 
  DB.withConnection { implicit c => //-- or injected db
    SQL(s"""select $fields from ******""")
      .on('instructor -> instructor, 'section -> section)
      .as(classTeacherP *)
  }

暫無
暫無

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

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