eric-1001c

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  3 随笔 :: 45 文章 :: 12 评论 :: 0 Trackbacks
HQL:
CreateQuery()
    Query query = session.createQuery("from Customer as c where c.name=:customerName and c.age=:customerAge");
    query.setString("customerName","Tom");
    query.setInteger("customerAge",21);

createQuery()支持方法链编程风格

QBC:(Criteria,Criterion,Expression)
    Criteria criteria = session.createCriteria(Customer.class);
    Criterion criterion1 = Expression.like("name", "T%");
    Criterion criterion2 = Expression.like("age", new Integer(21));
    Criteria = criteria.add(criterion1).add(criterion2);
    List result = criteria.list();

HQL&&QBC支持多态和继承查询
HQL&&QBC支持排序和分页
    HQL: Query query = session.createQuery("from Customer c order by c. name asc, c.age desc"); //排序
               query.setFirstResult(10);  //设定从对象开始检索起始位置为0
                              query.setMaxResults(10); //设定一次最多检索出的对象数目
    QBC: Criteria criteria = session.createCriteria(Customer.class);
               criteria.addOrder(Order.asc("name"));
               criteria.addOrder(Order.desc("age"));
               criteria.setFirstResult(0); //设定从对象开始检索起始位置为0
               criteria.setMaxResult(10); //设定一次最多检索出的对象数目

参数绑定能有效避免一些安全漏洞

HIbernate还能在xml文件里面配置HQL或者SQL本地查询语句:
    //for HQL
    <hibernate-mapping>
         <class name="mypack.Customer" table="CUSTOMERS">
         ...
                       </class>

                      <query name="findCustomersByName"><![CDATA[from Customer c where c.name like :name]]></query>
                   </hibernate-mapping>
    //for SQL
    <sql-query name="findCustomersByName"><![CDATA[select {c.*} from CUSTOMERS c where c.NAME like :name]]>
        <return alias="c" class="Customer"/>
    </sql-query>
    在程序中使用getNamedQuery()方法获得查询语句:
        Query query = session.getNamedQuery("findCustomersByName");
        query.setString("name",name);
        List result = query.list();


内连接:利用内连接可获取两表的公共部分的记录Select * from A JOIN B ON A.Aid=B.Bnameid


当查询的只是对象的部分属性的时候, 可以采用动态实例化查询结果,把实体的部分属性封装为一个javabean临时对象,不需要创建对象-关系映射文件
    package mypack;
    import java.io.Serializable;
    public class CustomerRow implements Serializable{
        private Long id;
        private String name;    
        private String orderNumber;
        
        public CustomerRow(Long id, String name, String orderNumber){
            this,id=id;
            ...
        }
        ...
         此处省略id,name和orderNumber属性的get和set方法
        ...
    }
    在程序中可以结合HQL查询语句这样使用,
    Iterator it = session.createQuery("select new mypack.CustomerRow(c.id,c.name,o.orderNumber)'
            +'from Customer c join c,orders o where o,orderNumber like 'T%'").list().iterator();
    此外如果结果集只有一个结果,可以用uniqueResult()方法
    Object[] obj = (Object[])session.createQuery("select max(c.age),min(c.age) from Customer c").uniqueResult();
    Integer maxAge = (Integer) obj[0];
    Integer minAge = (Integer) obj[1];

结果集中可以通过利用set和sql的distinct去掉

动态查询适宜用QBC检索方式,可以简化编程:
    public List findCustomers (String name, int age) throws HibernateException{
        Criteria criteria = session,createCriteria(Customer,class);
        if(name != null){
            criteria.add(Expression.like("name",nam.toLowerCase(),MactchMode.ANYWHWERE));    
        }
        if(age!=0){
            crteria.add(Expression.eq("age",new Integer(age)));
        }
        
        return criteria.list();
            
    }

集合过滤: 当orders集合由于使用延迟检索策略而没有在开始被初始化,当调用get***().iterator()方法初始化的时候不能对这个集合进行排序或者条件过滤,通过使

用集合过滤就能解决这个问题:
    List result = session.createFilter(customer.getOrders(), "where this.price>100 order by this.price")  .list();
集合过滤除了用于为集合排序或设置约束条件,还可以:
    1) 为集合分页
    List result = session.createFilter(customer.getOrders(), "order by this,price asc")
        .setFirstResult(10)
        .setMaxResult(50)
        .list();
    2)只选择集合的某个属性
    List result = session.createFilter(customer.getOrders(), "select this.orderNumber").list();
posted on 2008-02-18 16:11 Eric-1001c 阅读(229) 评论(0)  编辑  收藏 所属分类: Hibernate

只有注册用户登录后才能发表评论。


网站导航: