この質問は、前の質問に関連しています。しかし、その質問はクローズされているので、別の質問を作成する必要があります。使用例は次のとおりです。5 列のテーブルがあります。レコードを作成する場合、必要な列は 2 つだけです。後で、ユーザーは同じレコードにさらに情報を追加します。たとえば、次の構造を持つユーザー テーブルです。電話 | 電子メール | クレジット | レベル。ユーザーが登録するとき、必要なのはメールアドレスだけです。ユーザーは、ID と電子メールで作成されます。後で、ユーザーが電話番号、クレジットを追加したい場合、このユーザーが十分なクレジットを持っている場合、システムもレベルを更新します。私は
case class User(id:UUID, phone:Option[String], email:Option[String],
credit:Option[Double], level:Option[String]
私も持っています
sealed class Users extends CassandraTable[Users, User] {
object id extends UUIDColumn(this) with PartitionKey[UUID]
object phone extends OptionalStringColumn(this)
object email extends OptionalStringColumn(this)
object credit extends OptionalDoubleColumn(this)
object level extends OptionalStringColumn(this)
def fromRow(row: Row): User = {
User(id(row), phone(row), email(row), credit(row), level(row))
}
}
オプションの列を正しく使用していますか? ユーザーが 1 つ以上の特定の列を更新しているユース ケースでは、どのように進めればよいですか? こんなアップデート方法を試してみました
def updateUser(u: User): Future[ResultSet] = {
update.where(_.id eqs u.id).modify(_.phone setTo u.phone)
.and(_.email setTo u.email)
.and(_.credit setTo u.credit)
.and(_.level setTo u.level)
.consistencyLevel_=(ConsistencyLevel.QUORUM)
.future()
}
ID からテーブルを読み取り、既存の列の値を使用してユーザー オブジェクトを作成し、新しい値を追加してからレコードを更新する必要があるため、この方法はうまく機能しません。updateメソッドに条件をたくさん書くのも現実的ではありません。多数の列があり、各列を個別に更新できる場合、可能な値の組み合わせの膨大なリストを作成する必要があります。次の方法が機能する場合があります。
if(u.phone != None) update.where(_.id eqs u.id).modify(_.phone setTo u.phone).future
if(u.email != None) update.where(_.id eqs u.id).modify(_.email setTo u.email).future
if(u.credit != None) update.where(_.id eqs u.id).modify(_.credit setTo u.credit).future
......
しかし、更新のたびに更新の失敗を処理したい場合は悪夢になるので、それが良い習慣であるかどうかはわかりません。オプションの列を使用して、必要なものを達成するにはどうすればよいですか?