[Grails (グレイルズ) ] コントローラーで、params にある項目をリストとして扱う

Grails 2.3.4
コントローラで、params の可変項目 xxyyzz を リストで受け取る場合、

controller上で、

とか、

のように扱っていると、うまくいかない時がある。

例えば、以下のように項目が二つあるときは、

xxyyzz は、 [10200, 2300] のリストになるが、

一つの時は、

as List や、 each で無理にリストとして扱おうとすると、
[1,0,2,0,0] となってしまう。
これを回避するには、

とすれば、必ずリストとして値を取れる。
あとは、ループで回すなり、each で扱えばよい。




[Grails (グレイルズ) ] Criteria で、hasMany のドメインで、サブクエリを使う

ここで紹介した方法は、サブクエリの検索条件にメインのクエリの検索結果を入れる事が出来ない。
子テーブルは最新のものを持ってくるようなパターンでは使えない。なので、そのような場合は以下の方法で行う。

子要素は最新のを常に見るといった場合、以下のようなSQLを使いたい!

SELECT ..
FROM parent INNER JOIN child
ON ……..
WHERE child.id = (SELECT MAX(id) FROM child child_sub WHERE parent.id = child_sub.parent_id)

Criteria でどうするか。

説明

まず、親

そして、その子

この時、最新の publishDate を持つ、データで Book の name で ソートしたい時。

手順

サブクエリを作る

クエリに入れる

後は、order するだけ

子要素の name ソートしたい場合は、

のように、property をセットしてあげればよい。

動かないよ!!

  • DetachedCriteria
  • Projections

などは、以下から import してる? 同じようなのが、grails のパッケージにもかるから注意
各々以下からインポート

  • import org.hibernate.criterion.Projections
  • import org.hibernate.criterion.DetachedCriteria