2017-01-07 14 views
0

Существует сценарий, когда ТипЗапрос = «HR» (который приходит из запроса HTTP PUT), он должен вернуть всю информацию студентов, но вернуть титул «СОТРУДНИК»Возможно ли вернуть значение пользовательского столбца из таблицы базы данных sql с помощью slick?

Для примера рассмотрит «студент» таблицы с именем столбцами, идентификатор и название

+-------+----+--------------------+ 
+ name | id | title    +    
+-------+----+--------------------+ 
| KING | 10 | SOFTWARE ENGINEER | 
| BLAKE | 30 | SYSTEMS ENGINEER | 
+-------+----+--------------------+ 

ЦЕЛЬ: возвращение всех студентов, и переопределить название = "Employee"

Вот то, что я до сих пор

case class Student(name: String, id: Long, title: String) 

class StudentTable(tag: Tag) extends Table[Student](tag, "student") { 
     def name = column[String]("name") 
     def id = column[Long]("id") 
     def title = column[String]("title") 
     override def * = (name, id, title) <> ((Student.tupled, Student.unapply) 
} 

lazy val studentsQuery = TableQuery[StudentTable] 

Когда я пытаюсь отобразить и изменить значение заголовка в запросе, он жалуется на «повторное присвоение -val»

val f = studentsQuery.map(p => p.title = "EMPLOYEE).result 

complier error: Reassignment to val

Подход 2: Я попытался пройти в requestType как параметр функции для StudentTable, так что я могу изменить значение заголовка на основе requestType. Но тогда не удалось определить studentsQuery, так как он жаловался на «требуемый тег».

class StudentTable(tag: Tag)(reqType: String) extends Table[Student](tag, "student") { 
     def name = column[String]("name") 
     def id = column[Long]("id") 
     def title = req.type match { 
      case "HR" => "EMPLOYEE" 
      case _ => column[String]("title") 
     } 
     override def * = (name, id, title) <> ((Student.tupled, Student.unapply) 
} 

// Didn't understand how to provide tag 
lazy val studentsQuery = TableQuery[StudentTable]()("HR") 

compilation error: unspecified value parameters: Cons: (Tag) => StudentTable

ответ

0

Я не был в состоянии сделать это из Slick, но нашел способ сделать это с помощью JSON сериализации.

import scala.concurrent.Await 
import scala.concurrent.duration._ 
import slick.driver.MySQLDriver.api._ 

case class Student(name: String, id: Long, title: String) 

class StudentTable(tag: Tag) extends Table[Student](tag, "student") { 
     def name = column[String]("name") 
     def id = column[Long]("id") 
     def title = column[String]("title") 
     override def * = (name, id, title) <> ((Student.tupled,Student.unapply)} 

lazy val studentsQuery = TableQuery[StudentTable] 


implicit def StudentDataWrites = new Writes[Student] { 
    def writes(student: Student) = 
      Json.obj(
       "name" -> student.name, 
       "id" -> student.id, 
       "title" -> "EMPLOYEE" 
      ) 
} 

def getStudentsInfo() = Action { 
    val students= Await.Result(db.run(studentsQuery.size.result), 10.seconds) 
    Ok(Json.obj("students" -> Json.toJson(students))) 
} 
0

Вместо

val f = studentsQuery.map(p => p.title = "EMPLOYEE).result 

вы должны иметь:

val f = studentsQuery.result.map(_.map(p => p.copy(title = "EMPLOYEE"))) 
+0

Здравствуйте Pawel Не может получить код для выполнения компилятора жалуется на 2 вещи: 1. Не удается разрешить эталонную копию с такой подписью 2. Не удается разрешить название символа –

+0

Какую версии Slick вы используете? Вы предоставили противоречивые теги ('slick-2.0' и' slick-3.0'), поэтому неясно, какой из них у вас есть. –

+0

Im, используя slick2.0 –

 Смежные вопросы

  • Нет связанных вопросов^_^