簡體   English   中英

Slick:ClassCastException:scala.Some無法轉換為java.lang.String

[英]Slick: ClassCastException: scala.Some cannot be cast to java.lang.String

首先,我不得不提一下,我還是Slick的新手,主要學習和每次發現一些奇怪的情況,例如這樣。

我為Slick表定義了一個案例類Address,如下所示:

package model

import driver.PGDriver.api._
import format.DateTimeFormat._
import org.joda.time.DateTime
import play.api.libs.json._
import slick.lifted.Tag

case class Address(id: Option[Int] = None,
                   countryId: Option[Int] = None,
                   continentId: Option[Int] = None,
                   stateId: Option[Int] = None,
                   address1: String,
                   address2: Option[String],
                   city: String,
                   zip: String,
                   createdAt: DateTime = DateTime.now,
                   updatedAt: DateTime = DateTime.now,
                   deletedAt: Option[DateTime] = None,
                   createdBy: Option[String] = None,
                   updatedBy: Option[String] = None)

object Addresses {

  val addresses = TableQuery[Addresses]

  implicit lazy val addressFormat: Format[Address] = Json.format[Address]

  Json.toJson[DateTime](DateTime.now)

}

class Addresses(tag: Tag) extends Table[Address](tag, "address") {

  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)

  def countryId = column[Option[Int]]("country_id")
  def continentId = column[Option[Int]]("continent_id")
  def stateId = column[Option[Int]]("state_id")

  def address1 = column[String]("address1", O.SqlType("character varying(255)"))
  def address2 = column[Option[String]]("address1", O.SqlType("character varying(255)"))
  def city = column[String]("city", O.SqlType("character varying(255)"))
  def zip = column[String]("zip", O.SqlType("character varying(30)"))

  def createdAt = column[DateTime]("createdat")
  def updatedAt = column[DateTime]("updatedat")
  def deletedAt = column[Option[DateTime]]("deletedat")

  def createdBy = column[Option[String]]("createdby", O.SqlType("character varying(255)"))
  def updatedBy = column[Option[String]]("updatedby", O.SqlType("character varying(255)"))

  override def * =
    (
      id.?,
      countryId,
      continentId,
      stateId,
      address1,
      address2,
      city,
      zip,
      createdAt,
      updatedAt,
      deletedAt,
      createdBy,
      updatedBy
    ) <> (Address.tupled, Address.unapply)

  def addressStateIdIdx = index("address_state_id_idx", stateId)
  def state =
    foreignKey("address_state_id_fkey", stateId, GeoAreas.areas)(
      _.id.?,
      onUpdate = ForeignKeyAction.Cascade,
      onDelete = ForeignKeyAction.Restrict
    )

  def addressCountryIdIdx = index("address_country_id_idx", countryId)
  def country =
    foreignKey("address_country_id_fkey", countryId, GeoAreas.areas)(
      _.id.?,
      onUpdate = ForeignKeyAction.Cascade,
      onDelete = ForeignKeyAction.Restrict
    )

  def addressContinentIdIdx = index("address_continent_id_idx", continentId)
  def continent =
    foreignKey("address_continent_id_fkey", continentId, GeoAreas.areas)(
      _.id.?,
      onUpdate = ForeignKeyAction.Cascade,
      onDelete = ForeignKeyAction.Restrict
    )

}

這不是我的唯一一個通過Slick進行工作的類,但是由於某種原因,僅由於這個類,當嘗試使用join創建查詢時,我遇到了異常。 像這樣:

def search(searchCriteria: SearchCriteria,
             readyOnly: Boolean,
             drop: Long = 0,
             take: Long = 100): Future[Seq[(School, Option[Address])]] = {
    val q = for {
      (school, address) <- Schools.schools joinLeft Addresses.addresses on (_.addressId === _.id)
      if List(
        Some(school.deletedAt.isEmpty),
        searchCriteria.school.name.map(n => school.name.toLowerCase like s"%${n.toLowerCase}%"),
        searchCriteria.school.ready.map(r => school.ready === r)
      ).collect({ case Some(criteria) => criteria }).reduceLeftOption(_ && _).getOrElse(true: Rep[Boolean])
    } yield (school, address)

    db.run(q.drop(drop).take(take).result)
  }

我得到的異常是: play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[ClassCastException: scala.Some cannot be cast to java.lang.String]]

在此處輸入圖片說明

在這一點上,我什至不知道從哪里開始尋找問題。 該類的定義與我所擁有的其他類非常相似。 所有其他人都很好。 一切編譯都沒有問題。 僅在運行時中引發異常。

我想念什么? 謝謝,

UPDATE

我可能已經找到了問題,但是我不確定如何解決它以及為什么會發生。 正在執行的實際查詢是這樣的:

SELECT
  x2."id",
  x2."address_id",
  x2."name",
  x2."about",
  x2."number_of_students",
  x2."website_url",
  x2."media_id",
  x2."slug",
  x2."short_description",
  x2."ready",
  x2."classrooms",
  x2."year_established",
  x2."display_copyright",
  x2."createdat",
  x2."updatedat",
  x2."deletedat",
  x2."createdby",
  x2."updatedby",
  x2."dli_number",
  (CASE WHEN (x3."id" IS NULL)
    THEN NULL
   ELSE 1 END),
  x3."id",
  x3."country_id",
  x3."continent_id",
  x3."state_id",
  x3."address1",
  x3."address1",
  x3."city",
  x3."zip",
  x3."createdat",
  x3."updatedat",
  x3."deletedat",
  x3."createdby",
  x3."updatedby"
FROM "school" x2 LEFT OUTER JOIN "address" x3 ON x2."address_id" = x3."id"
WHERE ((x2."deletedat" IS NULL) AND (lower(x2."name") LIKE '%a%')) AND (x2."ready" = TRUE)
LIMIT 100
OFFSET 0

作為選擇的一部分,有些奇怪的case 為什么在那兒? 我究竟做錯了什么?

更新#2

另一方面,由於不知道如何精確地讀取查詢的行,因此我不確定此case語句是否會導致原始問題。

但是,我仍然被困住。

更新#3

因此,我只是嘗試了可能的最簡單查詢,該查詢僅包含地址表,如下所示:

def all(): Future[Seq[Address]] = db.run(Addresses.addresses.filter(_.deletedAt.isEmpty).result)

而且我仍然遇到同樣的例外。

更新#4

這是實際的地址表:

create table address
(
    id bigserial not nullconstraint address_pkey primary key,
    country_id bigint constraint address_country_id_fkey references geo_area on update cascade on delete restrict,
    continent_id bigint constraint address_continent_id_fkey references geo_area on update cascade on delete restrict,
    state_id bigint constraint address_state_id_idx references geo_area on update cascade on delete restrict,
    address1 varchar(255) not null,
    address2 varchar(255),
    city varchar(255) not null,
    zip varchar(30) not null,
    deletedat timestamp with time zone,
    createdat timestamp with time zone not null,
    updatedat timestamp with time zone not null,
    createdby varchar(255),
    updatedby varchar(255)
);

create index address_country_id_idx on address (country_id);

create index address_continent_id_idx on address (continent_id);

create index address_state_id_idx on address (state_id);

我有種感覺,那真是愚蠢,我是對的。 @Tyler,感謝您為我指明了正確的方向問題出在這里:

def address1 = column[String]("address1", O.SqlType("character varying(255)"))
  def address2 = column[Option[String]]("address1", O.SqlType("character varying(255)"))

看一下address2是如何定義的。 這兩個具有重復的列名。 因此顯然應該是:

def address1 = column[String]("address1", O.SqlType("character varying(255)"))
  def address2 = column[Option[String]]("address2", O.SqlType("character varying(255)"))

和往常一樣,例外是無用的:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM