grails-数据库编程(详见http://www.kuqin.com/grails-doc-1.0/guide/single.html)

一:动态查找器
    class Book {  String title  Date releaseDate  Author author     }                     class Author {  String name     }
       Book 类有一些属性,比如title, releaseDateauthor. 这些都可以按照方法表达式的格式被用
    于findByfindAllBy 方法。
    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 )
    同样的isNullisNotNull 不需要参数:
      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天内执行过 transactionsAccount实例
      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
十:对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"])               

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值