20130516-Grails In Action-4、モデルを作動させる(05小節)

7964 ワード

前のセクション基本的なダイナミッククエリーがどのように動作するかを紹介しました.grailsには多くのダイナミッククエリーがあります.他のクエリーの動作状況をテストするためにテストを構築します.
1、統合テストクラスを作成する
grails create-integration-test com.grailsinaction.QueryIntegration

テスト方法を作成する
 1 package com.grailsinaction
 2 
 3 import static org.junit.Assert.*
 4 import org.junit.*
 5 
 6 class QueryIntegrationTests {
 7 
 8     @Before
 9     void setUp() {
10         // Setup logic here
11     }
12 
13     @After
14     void tearDown() {
15         // Tear down logic here
16     }
17 
18     @Test
19     void testBasicDynamicFinders() {
20         new User(userId: 'glen', password: 'secret', profile: new Profile(email: '[email protected]')).save()
21         new User(userId: 'peter', password: 'sesame', profile: new Profile(homepage: 'http://www.peter.com/')).save()
22         def user = User.findByPassword('sesame')
23         assertEquals 'peter', user.userId
24         
25         user = User.findByUserIdAndPassword('glen',    'secret')
26         assertEquals 'glen', user.userId
27         
28         def now = new Date()
29         def users =    User.findAllByDateCreatedBetween(now-1, now)
30         assertEquals 2, users.size()
31         
32         def profiles = Profile.findAllByEmailIsNotNull()
33         assertEquals 1, profiles.size()
34     }
35 }

2、よく使うクエリー
操作名

コメント
LessThan
User.findAllByDateCreatedLessThan(lastWeek)
指定した値より小さい
LessThanEquals
User.findAllByDateCreatedLessThanEquals(lastWeek)
指定した値以下
GreaterThan
User.findAllByDateCreatedGreaterThan(lastWeek)
指定した値より大きい
GreaterThanEquals
User.findAllByDateCreatedGreaterThanEquals(lastWeek)
指定した値以上
Like
User.findAllByPasswordLike("secret")
SQL like式と同等
Ilike
User.findAllByPasswordIlike("Secret") Likeに似ていますが、大文字と小文字が敏感ではありません.
NotEqual
User.findAllByPasswordNotEqual("password")
等しくない
Between
User.findAllByDateCreatedBetween(lastWeek, now)
2つの値の間に等しい(2つのパラメータが必要)
IsNotNull
User.findAllByPasswordIsNotNull()
nullでない値(パラメータは不要)
IsNull
User.findAllByPasswordIsNull()
nullの値(パラメータ不要)
And
User.findAllByDateCreatedGreaterThanAndUserIdLike(lastWeek, 'glen')
Or
User.findAllByPasswordIsNullOrPasswordLike("secret")
3、ダイナミッククエリーは強力ですが、限界もあります.最も明らかなのは、2つのフィールドしかクエリーできません.より多くのクエリー条件を使用する場合は、HibernateのHQL構文クエリーを使用する必要があります.HQLの後の章について詳しく説明します.
まずQBE、インスタンスクエリーについて理解し、ここではQBEを理解するための統合テスト方法を確立します.
com.grailsinaction.QueryIntegrationにtestQueryByExampleのテスト方法を追加
 1     @Test
 2     void testQueryByExample() {
 3         new User(userId: 'glen', password: 'password').save()
 4         new User(userId: 'peter', password: 'password').save()
 5         new User(userId: 'cynthia', password: 'sesame').save()
 6         
 7         def userToFind = new User(userId: 'glen')
 8         def u1 = User.find(userToFind)
 9         assertEquals('password', u1.password)
10         
11         userToFind = new User(userId: 'cynthia')
12         def u2 = User.find(userToFind)
13         assertEquals('cynthia', u2.userId)
14         
15         userToFind = new User(password: 'password')
16         def u3 = User.findAll(userToFind)
17         assertEquals(['glen', 'peter'], u3*.userId)
18     }

このテスト方法では,オブジェクトをパラメータとしてデータクエリを行うことができることを示した.
4、私达はすでに1つのとても使いやすいfind方法があって、しかし时にはlist、countを得る必要があって、例えば:私达は前の5人のユーザーのリストの情报を得たくて、このように书くことができます
def users = User.list([sort: 'userId', order: 'asc',max: 5, fetch: [posts: 'eager']])

List()メソッドで使用できるオプションパラメータは、次のとおりです.
オプション
概要
max
指定した最大行数を返します.
sort
指定したフィールドでソート
order
指定した順序で並べ替え、desc:降順、asc:昇順
ignoreCase
大文字と小文字のフィルタを無視
fetch
だらだらロードポリシー
offset
戻り値は要素がどこから始まるかを指定し、主にページングに使用します.