hibernate

来源:互联网 发布:win7组策略设置优化 编辑:程序博客网 时间:2024/06/06 14:09
大小写敏感性问题

除了Java类与属性的名称外,查询语句对大小写并不敏感。


关联与连接


  • inner join(内连接)

  • left outer join(左外连接)

  • right outer join(右外连接)

  • full join (全连接,并不常用)


    from Cat as cat
        inner join fetch (抓取) cat.mate
        left join fetch cat.kittens

    "fetch"连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化,这种方法在使用到集合的情况下尤其有用,对于关联和集合来说,它有效的代替了映射文件中的外联接 与延迟声明(lazy declarations).


     聚集函数

    • avg(...), sum(...), min(...), max(...)

    • count(*)

    • count(...), count(distinct ...), count(all...)

    小技巧 & 小窍门

    你可以统计查询结果的数目而不必实际的返回他们:

    ( (Integer) session.iterate("select count(*) from ....").next() ).intValue()

    若想根据一个集合的大小来进行排序,可以使用如下的语句:

    select usr.id, usr.namefrom User as usr     left join usr.messages as msggroup by usr.id, usr.nameorder by count(msg)

    如果你的数据库支持子选择,你可以在你的查询的where子句中为选择的大小(selection size)指定一个条件:

    from User usr where size(usr.messages) >= 1

    如果你的数据库不支持子选择语句,使用下面的查询:

    select usr.id, usr.namefrom User usr.name    join usr.messages msggroup by usr.id, usr.namehaving count(msg) >= 1

    因为内连接(inner join)的原因,这个解决方案不能返回含有零个信息的User 类的实例, 所以这种情况下使用下面的格式将是有帮助的:

    select usr.id, usr.namefrom User as usr    left join usr.messages as msggroup by usr.id, usr.namehaving count(msg) = 0

    JavaBean的属性可以被绑定到一个命名查询(named query)的参数上:

    Query q = s.createQuery("from foo Foo as foo where foo.name=:name and foo.size=:size");q.setProperties(fooBean); // fooBean包含方法getName()与getSize()List foos = q.list();

    通过将接口Query与一个过滤器(filter)一起使用,集合(Collections)是可以分页的:

    Query q = s.createFilter( collection, "" ); // 一个简单的过滤器q.setMaxResults(PAGE_SIZE);q.setFirstResult(PAGE_SIZE * pageNumber);List page = q.list();

    通过使用查询过滤器(query filter)可以将集合(Collection)的原素分组或排序:

    Collection orderedCollection = s.filter( collection, "order by this.amount" );Collection counts = s.filter( collection, "select this.type, count(this) group by this.type" );

    不用通过初始化,你就可以知道一个集合(Collection)的大小:

    ( (Integer) session.iterate("select count(*) from ....").next() ).intValue();




  • 0 0
    原创粉丝点击