我是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子集?
我是否试图以反向方式列出数据?有没有更好的标签可供使用?我很困惑,需要一杯茶。
答案 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强制转换。