Grails > Grails ORM (GROM) : データアクセス編
更新日
2014-12-06
広告
GrailsはHibernateを内包しているため、簡単な設定でデータベース(RDBMS)処理を行うことができます。この機能のことを、GORM (Grails Object Relational Mapping)と呼びます。以下の説明は Grails 2.x 前提です。また、こちらの記事で説明した MyappRecord というドメインクラスを想定しています。
データの保存
作成したドメインクラスを、テーブルに保存します。テスト用のプログラムは、GroovyConsoleを使って実行してみます。$ grails console
(別に、上記のように'grails console'で起動することは必須ではありません。しかし、上記以外の方法でテストする場合は、自分でHibernateなどのライブラリ群にパスを通す必要があります。)
GroovyConsoleに、「MyappRecordをテーブルに追加するプログラム」を書いて実行します。
def p = new myapp.MyappRecord(id: 1, date: new Date(), money: 100) p.save()これで、MyappRecordがテーブルに追加されるはずです。
mysql> select * from myapp_record; +----+---------+---------------------+-------+ | id | version | date | money | +----+---------+---------------------+-------+ | 1 | 0 | 2012-08-26 00:29:08 | 100 | +----+---------+---------------------+-------+ 1 row in set (0.05 sec)saveメソッドを実行したのに、データが追加されない場合は、以下のようにしてみましょう。
p.save(flush: true)こうすると、Grailsがクエリをバッファリングすることなく、すぐに実行します。常にバッファリングを無効にしたい場合は、Config.groovyに以下を追加するとよいでしょう。
grails.gorm.autoFlush=trueまた、GrailsがどのようなSQLクエリをデータベースに発行しているかを調べたい場合は、DataSource.groovyに以下のパラメータを追加しましょう。SQLクエリを標準出力します。
dataSource { logSql = true formatSql = true :
データの取得
次に、idを指定して、MyappRecordを取得します。def r = myapp.MyappRecord.get(1) // 以下、取得したデータを表示 println r.id // -> 1 println r.money // -> 100
このように、非常に簡単に読み書き処理が行えることがわかります。
テーブルの全レコードを取得するには、以下のようにします。
def list = MyappRecord.list()dateカラムで逆順ソートして、20レコードだけ取得する場合は、以下のようにします。
def list = MyappRecord.list(sort: "date", order: "desc", max: 20)dateカラムに、範囲指定の条件を指定して、条件に合うレコード群を取得する場合は、以下のようにします。
def list = MyappRecord.findAllByDateBetween(startDate, finishDate)これにソート処理を組み合わせることも可能です。
def list = MyappRecord.findAllByDateBetween(startDate, finishDate, [sort: "date", order: "desc"])Grailsは、ドメインクラスのプロパティ名に応じて、上記のような条件指定メソッドを自動生成します。MyappRecordは'date'や'money'というプロパティ名を持つため、上記のようなメソッド名となります。例えば、dateカラムの範囲指定に、moneyカラムも条件に加えたい場合、以下のようなメソッドを使えます。
def list = MyappRecord.findAllByDateBetweenAndMoney(startDate, finishDate, 105)複数のカラムでソートしたい場合はCriteriaを使います。 以下は、dateカラムとmoneyカラムでソートする例です。
def c = MyappRecord.createCriteria() def records = c { order("date", "desc") order("money", "asc") maxResults(256) }
データの削除
データを削除したい場合は、以下のように、データベースからデータを取得し、deleteメソッドを実行すればよいです。def r = MyappRecord.get(1) r.delete()あるテーブルのデータをまとめて削除したい場合は、以下のように、deleteAllメソッドを使うとよいです。
def query = MyappRecord.where { id > 0 // 全レコードマッチするような条件を指定 } int num = query.deleteAll()
constraints nullable
ドメインクラスのプロパティが「nullでもOKか」は、constraintsの'nullable'で指定できます。
バージョン2.3の後半から、デフォルトで「nullが禁止」になりました。 つまり、ドメインクラスのプロパティに1つでもnullがある状態で、saveメソッドを実行するとエラーになります。
アプリケーションによっては、このふるまいが面倒になることもあると思います。 デフォルトで「nullでもOK」にするには、conf/Config.groovyに、以下の設定を追加します。
grails.gorm.default.constraints = { '*' (nullable: true) }
広告
お問い合わせは sweng.tips@gmail.com まで。