0

我是 Grails 的新手,一点一点地学习,但我真的很挣扎。

好的,所以我正在尝试从 Grails 中的一个类中呈现数据。它将数据存储在 mySQL 数据库中。当我们在类中有一个名为“id”的整数参数时,一切正常,但我们发现 Grails 会自动在数据库表中分配一个“id”行,因此我们将其删除。现在,当我在 gsp 中运行此代码时:

<g:each in="${Proposal.where {id == 1} }" var="proposal">
 <h3>
  ${proposal.name}
 </h3>
 <p>
  Starting date: <g:formatDate format="dd.MM.yyyy" date="${proposal.date_started}" />
 </p>
 <p>
  ending date:: <g:formatDate format="dd.MM.yyyy" date="${proposal.date_ended}" />
 </p>
 <p>
  description: ${ proposal.description }
 </p>   
</g:each>

'id == 1' 部分只是为了获取一些虚拟数据,我确保数据库中有一行 id 为 1。稍后将更改为采用输入参数,以显示动态详情页面。
当我尝试导航到此页面时,我收到此错误:

URI /site/proposal/
Class java.lang.ClassCastException
消息 java.lang.Integer 无法转换为 java.lang.Long

堆栈跟踪似乎只是告诉我发生这种情况的位置,将我指向上述代码的位置。数据库表有一个名为“id”的列,它是一个 bigint。Grails 不应该能够处理这种数据类型不匹配吗?无论哪种方式,不是 Integer 类的 long 和 bigint 子集吗?

我是否试图以向后的方式列出数据?有没有更好的标签可以使用?我很困惑,需要一杯茶。

4

1 回答 1

0

首先,最好将表示(视图)与数据库查询分开,因此如果查询更复杂且有更多变体,则此查询的更好位置是控制器或服务。

class PropsalController {
  def showFirst() {
    def proposal = Proposal.get(1) //or Proposal.where{ id == 1L }
    [proposal: proposal]
  }
}

由于您只过滤了对象的一个​​实例,因此您不需要每个标签。

 <h3>
  ${proposal.name}
 </h3>
 <p>
  Starting date: <g:formatDate format="dd.MM.yyyy" date="${proposal.date_started}" />
 </p>
 <p>
  ending date:: <g:formatDate format="dd.MM.yyyy" date="${proposal.date_ended}" />
 </p>
 <p>
  description: ${ proposal.description }
 </p> 

您面临的转换异常发生是因为默认情况下,Grails 将使用类型创建一个字段 id,Long并且条件不处理此转换。为此创建了一个JIRA 。如果您需要使用 where 查询,请确保转换为 Long 您的 id。

于 2013-03-28T12:57:02.103 回答