zoukankan      html  css  js  c++  java
  • Hibernate的检索方式

    检索方式

    1)导航对象图检索方式

    customer.getOrders().iterator();


    2)OID检索方式

    session.get()、load();


    3)HQL检索方式

    // 创建Query对象
    Query q = session.createQuery("from Customer as c where c.name=:name");
    // 动态绑定参数
    q.setString("name", "tom");
    // 执行查询语句
    q.list();

    只需要提供面向对象的HQL查询语句,Hibernate就能根据映射文件的配置,将HQL转换为SQL,并将JDBC ResultSet结果集映射为关联的对象图。

    4)QBC检索方式

    Query By Criteria

    // 创建Criteria对象
    Criteria criteria = session.createCriteria(Customer.class);
    
    //设定查询条件
    Criteria criteria1 = Restrictions.like("name", "T%");
    Criteria criteria2 = Restrictions.eq("age", new Integer(21));
    
    criteria = criteria.add(criteria1)
                       .add(criteria2);
    
    // 执行查询语句
    criteria.list();


    QBC还提供了一种QBE子功能(Query by Example),能够把exampleCustomer对象中所有不为null的属性作为查询条件:

    ......
    exampleCustomer.setAge(21);
    session.createCriteria(Customer.class)
           .add(Example.create(exampleCustomer))
           .list();

    类似于Query的setProperties:

    session.createQuery(from customer where age=:age and name=:name)
           .setProperties(exampleCustomer)
           .list();

    5)本地SQL检索方式

    Query q = session.createSQLQuery("select * from CUSTOMERS where ....");
    q.setString(...);
    q.list();

    方法

    使用别名

    HQL:

    session.createQuery("from Customer as c");

    QBC:

    不需要显式指定别名,Hibernate会自动把查询语句的根节点赋予别名“this”

    session.createCriteria(Customer.class)

                  .add(Restrictions.eq("this.name", "tom"))

                  .list();


    多态查询

    HQL和QBC支持多态查询,能查询出当前类及其所有子类实例。


    排序

    HQL:

    session.createQuery("from Customer as c order by c.name asc, c.age desc");

    QBC:

    session.createCriteria(Customer.class).addOrder(Order.asc("name"))

                                                                            .addOrder(Order.desc("age"));

    分页查询

    query.setFirstResult(97);

    query.setMaxResults(10);

    query.list();


    Criteria类似。


    检索单个对象

    session.createQuery(.....)

                   .setMaxResults(1)

                   .uniqueResult();

    Criteria类似。

    如果query包含多个对象,但没有调用setMaxResults(1),则会抛出NonUniqueResultException。


    Query.iterate()

    和list功能一样,但使用的查询机制不同:

    list会返回对象的所有属性,而iterate则只返回ID属性

    Iterator customers = query.iterate();
    while(customers.hasNext()){
        Customer cus = (Customer) customers.next(); //1
        String name = cus.getName();
    }

    执行到customers.next()时,先查session缓存,如果缓存中已存在该对象,则直接返回;若不存在,则查询数据库(返回所有属性)

    适用场景:

    1. CUSTOMERS表中有大量字段
    2. 启用了二级缓存,并且缓存中可能已包含待查询的Customer对象


    Query.setReadOnly()

    默认情况下,如果对查询到的对象的属性做了修改,则当Hibernate清理缓存时,会去同步更新回数据库。

    如果要只允许读取属性值,而不允许更新属性值,可用setReadOnly().










  • 相关阅读:
    Generate Parentheses
    Length of Last Word
    Maximum Subarray
    Count and Say
    二分搜索算法
    Search Insert Position
    Implement strStr()
    Remove Element
    Remove Duplicates from Sorted Array
    Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3001643.html
Copyright © 2011-2022 走看看