2015-01-07 75 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

回答