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

上一节介绍了一个基本的动态查询器是怎么工作的,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、一些常用的查询器

操作名示例注释
LessThanUser.findAllByDateCreatedLessThan(lastWeek)小于给定值
LessThanEqualsUser.findAllByDateCreatedLessThanEquals(lastWeek)小于或等于给定值
GreaterThanUser.findAllByDateCreatedGreaterThan(lastWeek)大于给定值
GreaterThanEqualsUser.findAllByDateCreatedGreaterThanEquals(lastWeek)大于或等于给定值
LikeUser.findAllByPasswordLike("secret")等价于 SQL like 表达式
IlikeUser.findAllByPasswordIlike("Secret")类似于Like,但不是大小写敏感
NotEqualUser.findAllByPasswordNotEqual("password")不等于
BetweenUser.findAllByDateCreatedBetween(lastWeek, now)等于两个值之间 (需要两个参数)
IsNotNullUser.findAllByPasswordIsNotNull()不为null的值 (不需要参数)
IsNullUser.findAllByPasswordIsNull()为null的值 (不需要参数)
AndUser.findAllByDateCreatedGreaterThanAndUserIdLike(lastWeek, 'glen') 
OrUser.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返回值指定元素从哪里开始,主要用于分页
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值