Как сопоставить результат запроса с классом case с помощью Anorm в scala

У меня есть 2 класса case:

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
       ********************
    """

P.S. Я поставил * вместо запроса из соображений безопасности:

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


person PriyalChaudhari    schedule 19.11.2018    source источник
comment
Ошибка ERROR: operator does not exist: uuid = character varying возникает из БД, когда она анализирует запрос, поскольку пытается сравнить несовместимые типы uuid с varchar (string). Я предполагаю, что ******** в запросе включает пункт WHERE, вызывающий это, но без него это невозможно подтвердить/помочь.   -  person cchantep    schedule 20.11.2018
comment
Кстати, в коде есть некоторые бородавки, такие как !!var!! connection (изменчивость ресурсов), query.as(Macro.namedParser[ClassTeacher].*) (RowParser материализуется для каждого запроса)   -  person cchantep    schedule 20.11.2018


Ответы (1)


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

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