所以我对Scala非常陌生,似乎在为一个简单的逻辑做一些可怕的错误。 我需要查询数据库以获取所有的WebsiteTemplates。 然后我试图访问序列的第一个元素(仅用于练习),但继续得到 ClassCastException - [Ljava.lang.Object;无法转换为models.WebsiteTemplate 。接下来,我想要返回作为Json获得的整个Seq。试过Json.arr()但不行。搜索但没有一个奇怪地匹配确切的用例。这与代码相关 -
WebsiteController
@Singleton
class WebsiteTemplateController @Inject()(websiteTemplateDAO: WebsiteTemplateDAO, db: DB) extends Controller{
def index = Action.async {
implicit request => db.withTransaction() {
implicit em => {
try {
val templates: Seq[WebsiteTemplate] = websiteTemplateDAO.findAll()
val template = templates(0)
Logger.info("The size is " + template.name)
Future(Ok(Json.obj(
"message" -> "Success"
)))
} catch {
case e: Exception =>
e.printStackTrace()
Future(InternalServerError(s"Lag gaye"))
}
}
}
}
}
WebsiteDAOImpl
@ImplementedBy(classOf[WebsiteTemplateDAOImpl])
trait WebsiteTemplateDAO extends DAO[WebsiteTemplate]{
def findAll()(implicit em: EntityManager): Seq[WebsiteTemplate]
}
@Singleton
class WebsiteTemplateDAOImpl @Inject()(db: DB) extends DAOImpl(classOf[WebsiteTemplate]) with WebsiteTemplateDAO{
override def findAll()(implicit em: EntityManager): Seq[WebsiteTemplate] = {
val query = em.createQuery(s"SELECT idint, name FROM WebsiteTemplate")
db.executeQuery(query)
}
}
DAOImpl
trait DAO[T] {
def findById(id:String)(implicit em:EntityManager) : Option[T]
def create : T
}
class DAOImpl[T](cls:Class[T]) extends DAO[T] {
def findById(id: String)(implicit em: EntityManager): Option[T] = {
val query = em.createQuery(s"Select c from ${cls.getName} as c where c.id=:id")
query.setParameter("id",id)
val list = query.getResultList
if (list.nonEmpty) {
Option(list(0).asInstanceOf[T])
} else {
None
}
}
override def create: T = {
cls.newInstance()
}
}
WebsiteTemplate
@Entity
@Table(name = "templates")
@EntityListeners(Array(classOf[SetForeignKeyOnSave]))
class WebsiteTemplate{
@Id
@Column(name = "id")
@BeanProperty
var intid: java.lang.Integer = _
/*@Transient
override var id: String = _*/
@BeanProperty
@Column(name = "name")
var name: String = _
}
对我的问题进行更多解释。在使用getClass()
方法获取模板类型(0)时,它显示为[Ljava.lang.Object
,而我希望它是WebsiteTemplate
类型。