上一节介绍了一个基本的动态查询器是怎么工作的,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 | 返回值指定元素从哪里开始,主要用于分页 |