20130516-Grails In Action-4、モデルを作動させる(05小節)
7964 ワード
前のセクション基本的なダイナミッククエリーがどのように動作するかを紹介しました.grailsには多くのダイナミッククエリーがあります.他のクエリーの動作状況をテストするためにテストを構築します.
1、統合テストクラスを作成する
テスト方法を作成する
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")
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のテスト方法を追加
このテスト方法では,オブジェクトをパラメータとしてデータクエリを行うことができることを示した.
4、私达はすでに1つのとても使いやすいfind方法があって、しかし时にはlist、countを得る必要があって、例えば:私达は前の5人のユーザーのリストの情报を得たくて、このように书くことができます
List()メソッドで使用できるオプションパラメータは、次のとおりです.
オプション
概要
max
指定した最大行数を返します.
sort
指定したフィールドでソート
order
指定した順序で並べ替え、desc:降順、asc:昇順
ignoreCase
大文字と小文字のフィルタを無視
fetch
だらだらロードポリシー
offset
戻り値は要素がどこから始まるかを指定し、主にページングに使用します.
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
戻り値は要素がどこから始まるかを指定し、主にページングに使用します.