NEO

蜀道难,难于上青天!

导航

20130516-Grails In Action-4、让模型工作(05小节)

Posted on 2013-05-17 10:50  页面载入出错  阅读(252)  评论(0编辑  收藏  举报

上一节介绍了一个基本的动态查询器是怎么工作的,grails还有很多的动态查询器,我们来建一个测试来测试一下其他查询器的工作状况

1、创建一个集成测试类

grails create-integration-test com.grailsinaction.QueryIntegration

创建一个测试方法testBasicDynamicFinders

 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: 'glen@glensmith.com')).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) 等于两个值之间 (需要两个参数)
IsNotNull User.findAllByPasswordIsNotNull() 不为null的值 (不需要参数)
IsNull User.findAllByPasswordIsNull() 为null的值 (不需要参数)
And User.findAllByDateCreatedGreaterThanAndUserIdLike(lastWeek, 'glen')  
Or User.findAllByPasswordIsNullOrPasswordLike("secret")  

3、动态查询器很强大,但是也有局限性。最明显的是只能查询两个字段,如果要用更多的查询条件,则需要使用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、我们已经有一个非常好用的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 返回值指定元素从哪里开始,主要用于分页