2015-01-07 266 views
0

我有一個簡單的員工表,它具有manager_id,通過它可以引用它自己。我試圖與他的經理相處僱員UnexpectedNullableFound左邊(自己)加入別名表

這裏是我的解析器

object User{ 

    val simple = { 
    get[Option[Int]]("users.user_id")~ 
    str("users.email")~ 
    get[Option[String]]("users.first_name")~ 
    get[Option[String]]("users.last_name")~ 
    get[Option[String]]("users.nick_name")~ 
    bool("users.is_manager")~ 
    bool("users.is_hr_manager")~ 
    bool("users.is_admin")~ 
    get[Option[Int]]("users.manager_id") map { 
    case user_id~email~first_name~last_name~nick_name~is_manager~is_hr_manager~is_admin~manager_id => { 
     User(user_id,email,first_name,last_name,nick_name,is_manager,is_hr_manager,is_admin,manager_id) 
     } 
    } 
    } 

    def getAliasedParser(alias:String):RowParser[User] = { 
    getAliased[Option[Int]](alias+"_user_id")~ 
    getAliased[String](alias+"_email")~ 
    getAliased[Option[String]](alias+"_first_name")~ 
    getAliased[Option[String]](alias+"_last_name")~ 
    getAliased[Option[String]](alias+"_nick_name")~ 
    getAliased[Boolean](alias+"_is_manager")~ 
    getAliased[Boolean](alias+"_is_hr_manager")~ 
    getAliased[Boolean](alias+"_is_admin")~ 
    getAliased[Option[Int]](alias+"_manager_id") map { 
     case user_id~email~first_name~last_name~nick_name~is_manager~is_hr_manager~is_admin~manager_id => { 
      User(user_id,email,first_name,last_name,nick_name,is_manager,is_hr_manager,is_admin,manager_id) 
     } 
     } 
    } 

val withManager = User.simple ~ (User.getAliasedParser("mgr") ?) map { 
    case user~manager => (user,manager) 
    } 

UnexpectedNullableFound(的ColumnName(users.email,有些(mgr_email)))]

這裏是我的查詢:

def findByEmailWithManager(email: String): Option[(User,Option[User])] = { 
    DB.withConnection { implicit connection => 
     SQL(""" 
      SELECT 
      `users`.`user_id`, 
      `users`.`email`,  
      `users`.`first_name`,  
      `users`.`last_name`,  
      `users`.`nick_name`,  
      `users`.`is_manager`,  
      `users`.`is_hr_manager`,  
      `users`.`is_admin`,  
      `users`.`manager_id` , 
      b.`user_id` mgr_user_id, 
      b.`email` mgr_email,  
      b.`first_name` mgr_first_name,  
      b.`last_name` mgr_last_name,  
      b.`nick_name` mgr_nick_name,  
      b.`is_manager` mgr_is_manager,  
      b.`is_hr_manager` mgr_is_hr_manager,  
      b.`is_admin` mgr_is_admin,  
      b.`manager_id` mgr_manager_id 
      FROM `users` left outer join `users` b on (users.manager_id = b.user_id) 
      where `users`.email = {email} 
      """).on('email -> email).as(User.withManager.singleOpt) 
    } 
    } 

我得到這個錯誤,當我嘗試執行查詢

UnexpectedNullableFound(ColumnName(users.email,Some(mgr_email)))] 

這裏是我的情況下,類

case class User(id:Option[Int]=None,email:String,firstName:Option[String]=None,lastName:Option[String]=None,nickName:Option[String]=None,isManager:Boolean=false,isHrManager:Boolean=false,isAdministrator:Boolean=false,managerId:Option[Int]=None) 

有人能幫助我理解爲什麼我得到這個錯誤?在此先感謝

+0

列是'NULL'而在解析器不可選。您應該使用相同的參數手動執行查詢以檢查解析的列,並可能通過將其解析爲可選來更新解析。 – cchantep

+0

我在這裏使用自連接,所以右邊可以完全爲null。這是否意味着我必須將右側的所有映射定義爲可選?那麼在User.getAliasedParser(「mgr」)之後添加問號有什麼意義?) – vumaasha

回答