Q: How do I use nested models?

A: In ldbc, you can map multiple columns to nested models.

For example, here's how to give a User model a nested Name model, which maps to separate columns (e.g., firstname, lastname) in the database:

// Definition of nested model
case class User(id: Long, name: User.Name, email: String)
object User:
  case class Name(firstName: String, lastName: String)

// Table definition example
class UserTable extends Table[User]("user"):
  def id: Column[Long] = bigint().autoIncrement.primaryKey
  def firstName: Column[String] = varchar(255)
  def lastName: Column[String] = varchar(255)
  def email: Column[String] = varchar(255)
  
  // Convert (firstName *: lastName) to User.Name, and map id, name, and email to User
  override def * : Column[User] =
    (id *: (firstName *: lastName).to[User.Name] *: email).to[User]
  
// Usage example:
TableQuery[UserTable].selectAll.query.to[List].foreach(println)
// Records retrieved from UserTable's select are automatically converted to User.Name(firstName, lastName)

With this definition, the database columns first_name and last_name correspond to firstName and lastName in User.Name, allowing you to use them as a nested model.

References