• 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().










  • 相关阅读:
    高德地图的使用点标记、折线标记
    vue 过滤器filter(全面)
    vue cli4.0 快速搭建项目详解
    vue cli3.0快速搭建项目详解(强烈推荐)
    路由传参的三种方法
    router-link 返回上页 和 新窗口打开链接
    Django REST framework+Vue 打造生鲜超市(一)
    Android笔记:波纹按钮
    简单更换博客园背景
    SUID,SGID和SBIT
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3001643.html
Copyright © 2020-2023  润新知