一:动态查找器
比如我们说
class Account {
…
def hasMany = [transactions:Transaction]
Set transactions
…
}
我们可以使用属性名
查找所有过去10天内执行过
def c = Account.createCriteria()
def now = new Date()
def results = c.list {
transactions { between('date',now-10, now) }
}
六:投影(Projections)查询
要使用投影你需要在criteria builder树里定义一个"projections"节点。projections节点内可用的方法等同于 Hibernate 的 Projections 类中的方法.
def c = Account.createCriteria()
def numberOfBranches = c.get {
projections { countDistinct('branch') }
}
八:使用可滚动的结果
你可以通过调用scroll方法来使用Hibernate的 ScrollableResults 特性。
def results = crit.scroll {
maxResults(10)
}
def f = results.first()
def l = results.last()
def n = results.next()
def p = results.previous()
def future = results.scroll(10)
def accountNumber = results.getLong('number')
九:方法引用
如果你调用一个没有方法名的builder,比如:
c { … }
默认的会列出所有结果,因此上面代码等价于:
c.list { … }
十:对hibernate的支持
GORM也支持Hibernate的查询语言HQL,在Hibernate文档中的 Chapter 14. HQL: The Hibernate Query Language ,可以找到它非
常完整的参考手册。
GORM提供了一些使用HQL的方法,包括 find, findAll 和 executeQuery。下面是一个查询的例子:
def results = Book.findAll( "from Book as b where b.title like 'Lord of the%'")
位置和命名参数
上面的例子中传递给查询的值是硬编码的,但是,你可以同样地使用位置参数:
def results = Book.findAll( "from Book as b where b.title like ?", [ "The Shi%"])
或者甚至使用命名参数:
def results = Book.findAll( "from Book as b where b.title like :search or b.author like :search", [search: "The Shi%"])
多行查询
如果你需要将查询分割到多行你可以使用一个行连接符:
def results = Book.findAll( """\\ from Book as b, \\ Author as a \\ where b.author = a and a.surname = ? """, ['Smith']) Groovy 的多行字符串对HQL查询无效
分页和排序
使用HQL查询的时候你也可以进行分页和排序。要做的只是简单指定分页和排序参数作为一个散列在方法的末尾调用:
def results = Book.findAll( "from Book as b where b.title like 'Lord of the%'", [max:10, offset:20, sort: "asc", order: "title"])
class Book { String title Date releaseDate Author author } class Author { String name }五:查询关联Book
类有一些属性,比如title
,releaseDate
和author
. 这些都可以按照方法表达式的格式被用 于findBy 和 findAllBy 方法。 def book = Book.findByTitle("The Stand") book = Book.findByTitleLike("Harry Pot%") book = Book.findByReleaseDateBetween( firstDate, secondDate ) book = Book.findByReleaseDateGreaterThan( someDate ) book = Book.findByTitleLikeOrReleaseDateLessThan( "%Something%", someDate ) 方法表达式 在GORM中一个方法表达式由前缀(比如findBy)后面跟一个表达式组成,这个表达式由一个或多个属性组成。基本形式是: book.findBy[Property][Suffix]*[Boolean Operator]*[Property][Suffix] 用*标记的部分是可选的。每个后缀都会改变查询的性质。例如: def book = Book.findByTitle("The Stand") book = Book.findByTitleLike("Harry Pot%") 可用的后缀包括(可以通过or或and或not链接):
LessThan
- 小于给定值LessThanEquals
(data) -小于或等于给定值GreaterThan
(data) - 大于给定值GreaterThanEquals
(data) - 大于或等于给定值Like
(data) - 等价于 SQL like 表达式Ilike
(data) -类似于Like
, 但不是大小写敏感NotEqual(data)
- 不等于Between
(a,b)- 介于两个值之间 (需要两个参数)IsNotNull
() - 不为null的值(不需要参数)IsNull
() - 为null的值 (不需要参数) 你会发现最后三个方法标注了参数的个数,他们的示例如下: def now = new Date() def lastWeek = now - 7 def book = Book.findByReleaseDateBetween( lastWeek, now ) 同样的isNull
和isNotNull
不需要参数: def books = Book.findAllByReleaseDateIsNull() 二:基本常用 userList=findByUsernameLike("%h%i%") userList=findAllBySex("m") userList=findAllByUsernameLike("%h%i%") user = User.findByReleaseDateBetween( firstDate, secondDate ) user = User.findByReleaseDateGreaterThan( someDate ) user = User.findByTitleLikeOrReleaseDateLessThan( "%Something%", someDate ) println User.findAllByUsername("liuhan") user=new User(id:3,username:"yjpfj1203",sex:'f',phone:"78945612651") //保存 user.save() //更新 u.username= "liuhan1203" u.save() //删除 u.delete() //返回全部列表 userList = User.list() 三:分页 userList = User.list([max:10,offset:10,sort:'title',order:'asc']) userList = findAllByTitleLike("Harry Pot%", [max:3, offset:2, sort:"asc", order:"title"]) 四:条件查询 Criteria是一种类型安全的、高级的查询方法,它使用Groovy builder构造强大复杂的查询。它是一种比使用StringBuffer好得多的选择。 Criteria可以通过createCriteria 或者 withCriteria 方法来使用。builder使用Hibernate的Criteria API,builder上的节点对应 Hibernate Criteria API中 Restrictions 类中的静态方法。用法示例: def c = Account.createCriteria() def results = c { like("holderFirstName", "Fred%") and { between("balance", 500, 1000) eq("branch", "London") } maxResults(10) order("holderLastName", "desc") }
比如我们说
Account
类有关联到多个
Transaction
对象:
class Account {
…
def hasMany = [transactions:Transaction]
Set transactions
…
}
我们可以使用属性名
transaction
作为builder的一个节点来查询这个关联:
查找所有过去10天内执行过
transactions
的
Account
实例
def c = Account.createCriteria()
def now = new Date()
def results = c.list {
transactions { between('date',now-10, now) }
}
六:投影(Projections)查询
要使用投影你需要在criteria builder树里定义一个"projections"节点。projections节点内可用的方法等同于 Hibernate 的 Projections 类中的方法.
def c = Account.createCriteria()
def numberOfBranches = c.get {
projections { countDistinct('branch') }
}
八:使用可滚动的结果
你可以通过调用scroll方法来使用Hibernate的 ScrollableResults 特性。
def results = crit.scroll {
maxResults(10)
}
def f = results.first()
def l = results.last()
def n = results.next()
def p = results.previous()
def future = results.scroll(10)
def accountNumber = results.getLong('number')
九:方法引用
如果你调用一个没有方法名的builder,比如:
c { … }
默认的会列出所有结果,因此上面代码等价于:
c.list { … }
方法 | 描述 |
---|---|
list | 这是默认的方法。它会返回所有匹配的行。 |
get | 返回唯一的结果集,比如,就一行。criteria已经规定好了,仅仅查询一行。这个方法更方便,免得使用一个limit来只取第一行使人迷惑。 |
scroll | 返回一个可滚动的结果集 |
listDistinct | 如果子查询或者关联被使用,有一个可能就是在结果集中多次出现同一行,这个方法允许只列出不同的条目,它等价于CriteriaSpecification 类的DISTINCT_ROOT_ENTITY 。 |
GORM也支持Hibernate的查询语言HQL,在Hibernate文档中的 Chapter 14. HQL: The Hibernate Query Language ,可以找到它非
常完整的参考手册。
GORM提供了一些使用HQL的方法,包括 find, findAll 和 executeQuery。下面是一个查询的例子:
def results = Book.findAll( "from Book as b where b.title like 'Lord of the%'")
位置和命名参数
上面的例子中传递给查询的值是硬编码的,但是,你可以同样地使用位置参数:
def results = Book.findAll( "from Book as b where b.title like ?", [ "The Shi%"])
或者甚至使用命名参数:
def results = Book.findAll( "from Book as b where b.title like :search or b.author like :search", [search: "The Shi%"])
多行查询
如果你需要将查询分割到多行你可以使用一个行连接符:
def results = Book.findAll( """\\ from Book as b, \\ Author as a \\ where b.author = a and a.surname = ? """, ['Smith']) Groovy 的多行字符串对HQL查询无效
分页和排序
使用HQL查询的时候你也可以进行分页和排序。要做的只是简单指定分页和排序参数作为一个散列在方法的末尾调用:
def results = Book.findAll( "from Book as b where b.title like 'Lord of the%'", [max:10, offset:20, sort: "asc", order: "title"])