Grails GORM查询

GORM提供了从动态查询器、criteria到hql的一系列查询方式。另外Groovy通过GPath操纵集合的能力,和GORM的像sort、findAll等方法结合起来,形成一个强大的组合。

获取列表

(1)支持分页参数

def books = Book.list(offset:10, max:20)

(2)也可以排序

def books = Book.list(sort:"title",order:"asc")

根据数据库标识符取回

可以根据一个标识符的集合使用getAll方法取得一个实例列表:

def books = Book.getAll(23, 93, 81)

动态查询器

GORM支持动态查找器的概念,动态查找器看起来像一个静态方法的调用,但是这些方法本身在代码中实际并不存在。而是在运行时基于一个给定类的属性,自动生成一个方法。

(1)方法表达式

在GORM中一个方法表达式由前缀,比如findBy后面跟一个表达式组成,这个表达式由一个或多个属性组成,基本形式:

Book.findBy([Property][Comparator][Boolean Operator])?[Property][Comparator]

用“?”标记的部分是可选的,每个后缀都会改变查询的性质。

(2)布尔逻辑

方法表达式也可以使用一个布尔操作符来组合两个criteria:

def books = Book.findAllByTitleLikeAndReleaseDateGreaterThan("%Java%", new Date()-30)

现在,你最多只能用两个criteria做动态查询,也就是说,该方法的名称只能包含一个布尔操作,如果你需要使用更多的,你应该考虑使用criteria或HQL。

(3)查询关联

def author = Author.findByName("Stephen King")
def books = author ? Book.findAllByAuthor(author) : []

在这里如果Author实际不为null,我们在查询中用它取得给定Author的所有Book实例。

条件查询

Criteria是一种类型安全的、高级的查询方法,它使用Groovy builder构造强大复杂的查询,它是一种比使用StringBuilder好得多的选择。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") 
}

(1)逻辑与和逻辑或

and { between("balance", 500, 1000) eq("branch", "London") }
 or { between("balance", 500, 1000) eq("branch", "London") }
not { between("balance", 500, 1000) eq("branch", "London") }

(2)查询关联

关联可以通过使用一个跟关联属性同名的节点来查询。比如,我们说Account类有关联到多个Transaction对象

class Account { … def hasMany = [transactions:Transaction] Set transactions … }

我们可以使用属性名transaction作为builder的一个节点来查询这个关联。

def c = Account.createCriteria() def now = new Date() def results = c.list { transactions { between('date',now-10, now) } }

上面的代码将会查找所有过去10天执行过transactions的Account实例。

(3)投影查询

投影被用于定制查询结果,要使用投影你需要在criteria builder树里定义一个“projections”节点,projections节点内可用的方法等同于Hibernate的Projections类中的方法。

def c = Account.createCriteria()
def numberOfBranches = c.get { projections { countDistinct('branch') } }

(4)使用可滚动的结果

你可以通过调用scroll方法来使用Hibernate的ScrollableResult特性:

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')

不同于JDBC,结果列的编号是从0开始。

Hibernate查询语言(HQL)

参考文档:http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/queryhql.html

GORM也支持Hibernate的查询语言HQL,GORM提供了一些使用HQL的方法

(1)位置和命名参数

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%"])

(2)多行查询

如果你需要将查询分割到多行你可以使用一个行连接符

def results = Book.findAll("\ from Book as b, \ Author as a \ where b.author = a and a.surname = ?", ['Smith'])

(3)分页和排序

def results = Book.findAll("from Book as b where b.title like 'Lord of the%' order by b.title asc", [max:10, offset:20])

阅读更多

扫码向博主提问

chs007chs

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • java
  • linux
去开通我的Chat快问
个人分类: grails/groovy/gradle
上一篇Java 存储过程
下一篇Grails - Interceptors
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭