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开始。
参考文档: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])
最后欢迎大家访问我的个人网站:1024s