1

I have a number of basic queries define, and am using query composition to add stuff such as ordering, paging, where clauses and so on...

But I have a problem accessing the fields of the joined 2nd table in the where clause...

Here's my table queries and my table. All tables are mapped to case classes.

val basicCars = TableQuery[CarTable]
val basicCarValues = TableQuery[CarValueTable]

val carsWithValues = for {
    (c, v) <- basicCars leftJoin basicCarValues on (_.id === _.carId)
} yield (c, v.?)

Now I reuse/compose queries by doing stuff such as

carsWithValues.where(_._1.id === someId)

which works perfectly...

But if I want to access any value of the 2nd table... and I try

carsWithValues.where(_._2.latestPrice === somePrice)

It tells me that somePrice is not a member of MappedProjection......

error: value somePrice is not a member of scala.slick.lifted.MappedProjection[Option[com......datastore.slick.generated.Tables.CarValue],(Option[Long], Option[Long], Option[String],.....

I understand that this kind of can't work, cause _._2 is a MappedProjection and not just a CarValue sitting in the tuple..

But I can't figure out how to use any field of the table that is in the MappedProjection in a where clause?

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459

1 Answers1

3

The .? from the Slick code generator is implemented using a MappedProjection, which doesn't have the members anymore. If you postpone the call to .? it works:

val carsWithValues = for {
    (c, v) <- basicCars leftJoin basicCarValues on (_.id === _.carId)
} yield (c, v)

carsWithValues.where(_._2.latestPrice === somePrice).map{ case (c,v) => (c,v.?) }
cvogt
  • 11,260
  • 30
  • 46