playframework 2.0 - Turn Scala Anorm record into a specific object -


using findby seen below, can search authentications table record key , value

def findby(key: string, value: string): = db.withconnection { implicit connection =>   sql("select * authentications {key}={value} limit 1").on('key -> key, 'value -> value) } 

example:

authentication.findbyme("email", "toot@toot.com") 

returns:

res1: = simplesql(sqlquery(select * authentications ?=? limit 1,list(key, value),none),list((key,parametervalue(email,anorm.tostatement$$anon$3@4ca9aed5)), (value,parametervalue(toot@toot.com,anorm.tostatement$$anon$3@18154945))),<function1>) 

how can turn authentication object? object fields got query.

i've tried following, can't passed nullable object error when there's there's null in 1 of columns. can't figure out how put use solutions offered here

val authentication_parser =   get[string]("email") ~   get[string]("encrypted_password") ~   get[string]("user_id") ~   get[string]("token") ~   get[date]("created_at") ~   get[date]("updated_at")  val authentication = {   authentication_parser map {     case email~encrypted_password~user_id~token~created_at~updated_at => authentication(email, encrypted_password, user_id, token, created_at, updated_at)   } } 

using so:

def findby(key: string, value: string): = db.withconnection { implicit connection =>   sql("select * authentications {key}={value} limit 1").on('key -> key, 'value -> value).as(authentication *) } 

i'm new scala, i've been riddled problems one.

any column nullable in table should option in authentication object. example, if table this:

`email` varchar(255) not null, `encrypted_password` varchar(255) null, `user_id` int(11) not null, `token` varchar(255) null, `created_at` datetime not null, `updated_at` datetime null 

then should have:

case class authentication(email: string, password: option[string], userid: int, token: option[string], createdat: date, updatedat: option[date]) 

your parser like:

val authentication_parser = {    get[string]("email") ~    get[option[string]]("encrypted_password") ~    get[string]("user_id") ~    get[option[string]]("token") ~    get[date]("created_at") ~    get[option[date]]("updated_at") map {        case email~encrypted_password~user_id~token~created_at~updated_at =>             authentication(email, encrypted_password, user_id, token, created_at, updated_at)    } } 

if reason don't want use option in authentication class, use getorelse in map portion , fill in default values (much uglier):

case email~encrypted_password~user_id~token~created_at~updated_at =>             authentication(email, encrypted_password.getorelse(""), user_id, token.getorelse(""), created_at, updated_at.getorelse(new date()) 

for paranoid, may want exclude hashed password parser when retrieving database:

val authentication_parser = {    get[string]("email") ~    get[string]("user_id") ~    get[option[string]]("token") ~    get[date]("created_at") ~    get[option[date]]("updated_at") map {        case email~user_id~token~created_at~updated_at =>             authentication(email, none, user_id, token, created_at, updated_at)    } } 

i suggest change .as() parameter. sql("....").on(...).as(authentication_parser *) parse list[authentication]. since you're using limit 1 in query, better use authentication_parser.single (parses authentication) or authentication_parser.singleopt (parses option[authentication]). singleopt way go single records, single raise exception if nothing found.

lastly, ought make return type of function other any. (whatever matches parser) sorry wall of text.


Comments

Popular posts from this blog

python - Subclassed QStyledItemDelegate ignores Stylesheet -

java - HttpClient 3.1 Connection pooling vs HttpClient 4.3.2 -

SQL: Divide the sum of values in one table with the count of rows in another -