通过Grails的自动生成ID在GSP中显示数据时出错 - 获取数据类型错误

时间:2013-03-28 12:39:21

标签: grails gsp

我是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       /网站/方案/
      类java.lang.ClassCastException
      消息java.lang.Integer无法强制转换为java.lang.Long

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

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

1 个答案:

答案 0 :(得分: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会创建一个类型为Long的字段ID,并且标准不处理此强制转换。为此创建了JIRA。如果您需要在查询位置使用,请确保为您的ID强制转换。

相关问题