這個問題與以前的question有關。但由於這個問題已經結束,我必須另外創建一個。 用例如下:我有一個5列的表。創建記錄時,只需要2列。稍後用戶將在同一記錄中添加更多信息。例如具有以下結構的用戶表:id |電話|電子郵件|信貸|水平。當用戶註冊時,我只需要他們的電子郵件地址。用戶將被創建一個ID和電子郵件。稍後,用戶想要添加電話號碼,學分,系統也會在該用戶擁有足夠的學分時更新級別。 我創建了一個如何使用幻影dsl的可選列?
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))
}
}
我使用的可選列吧? 我應該如何處理用戶更新一個或多個特定列的用例?我想這樣的
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表,並建立與現有的列值,並增加新的值的用戶對象,然後更新記錄這種方法不順利的更新方法。在更新方法中編寫很多條件也是不現實的。如果我有很多列並且每列可以單獨更新,那麼我將不得不編寫一個可能的值組合列表。下面的方法可能工作:
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
......
但我不知道這是一個很好的做法,因爲這將是一場噩夢,如果你要處理的每次更新更新失敗。我應該如何使用可選列來實現我所需要的?
的'column.parse(行).toOption'自動添加爲您在選擇使用'Optional'列。類似集合的東西也會自動默認爲空而不需要'Optional'。 – flavian