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/
クラス java.lang.ClassCastException
メッセージ java.lang.Integer は java.lang.Long にキャストできません

スタック トレースは、これが発生した場所を表示する以上のことはしていないようで、前述のコードの場所を示しています。データベース テーブルには、bigint である「id」という名前の列があります。Grails はこの種のデータ型の不一致を処理できるべきではないでしょうか? どちらにしても、Integer クラスの long と bigint のサブセットではありませんか?

逆方向にデータをリストしようとしていますか? 使用するより良いタグはありますか? 私は混乱していて、お茶が必要です。

4

1 に答える 1

0

まず、プレゼンテーション (ビュー) をデータベース クエリから分離することをお勧めします。そのため、クエリがより複雑でバリエーションが多い場合は、このクエリの場所としてコントローラーまたはサービスを使用することをお勧めします。

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

オブジェクトのインスタンスを 1 つだけフィルタリングしたので、 each タグは必要ありません。

 <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 クエリを使用する必要がある場合は、ID を Long にキャストしてください。

于 2013-03-28T12:57:02.103 に答える