Как сопоставить результат запроса с классом дел, используя Anorm в Scala - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть 2 класса дел, подобных этому:

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

2-й класс:

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

И такой запрос:

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

PS Я поставил* вместо запроса по соображениям безопасности:

Таким образом, мой запрос возвращает 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 части кода

1 Ответ

0 голосов
/ 20 декабря 2018

Вам нужно поле успеха? Часто пустого списка будет достаточно?

Я считаю парсеры очень полезными (и многократно используемыми), поэтому что-то вроде следующего в синглтоне 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 *)
  }
...