﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-dragonofson-文章分类-Hiberbate</title><link>http://www.blogjava.net/dragonofson/category/12321.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 05:58:32 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 05:58:32 GMT</pubDate><ttl>60</ttl><item><title>Hibernate常用查询语句</title><link>http://www.blogjava.net/dragonofson/articles/53788.html</link><dc:creator>Dragonofson</dc:creator><author>Dragonofson</author><pubDate>Mon, 19 Jun 2006 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/dragonofson/articles/53788.html</guid><wfw:comment>http://www.blogjava.net/dragonofson/comments/53788.html</wfw:comment><comments>http://www.blogjava.net/dragonofson/articles/53788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dragonofson/comments/commentRss/53788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dragonofson/services/trackbacks/53788.html</trackback:ping><description><![CDATA[
		<strong>Hib的检索方式<br /></strong>1'导航对象图检索方式。通过已经加载的对象，调用.iterator()方法可以得到order对象<br />如果是首次执行此方法，Hib会从数据库加载关联的order对象，否则就从缓存中得到。<br />2'OID检索方式。通过session的get，load方法知道了OID的情况下可以使用<br />3'HQL检索方式。使用面向对象的HQL查询语句session的find方法利用HQL来查询<br />4'QBC检索方式。利用QBCAPI来检索它是封装了基于字符串的查询语句<br />5'本地的SQL检索方式。使用本地数据库的SQL查询语句Hib会负责把检索到的JDBC结果集映射为持久化对象图。<br /><br />五种检索方式的使用场合和特点：<br /><br />HQL ： 是面向对象的查询语言，同SQL有些相似是Hib中最常用的方式。<br />       查询设定各种查询条件。<br />       支持投影查询，检索出对象的部分属性。<br />       支持分页查询，允许使用having和group by<br />       提供内制的聚集函数，sum()，min()，max()<br />       能调用用户的自定义SQL<br />       支持子查询，嵌入式查询<br />       支持动态绑定参数<br />建议使用Query接口替换session的find方法。<br />   Query Q = session.createQuery("from customer as c where c.name = :customerName" + "and c.age = :customerAge");<br />   query.setString ("customerName" , "tom");<br />   query.setInteger("customerAge" , "21");<br />   list result = query.list();<br />QBC :  QBCAPI提供了另一种方式，主要是Criteria接口、Criterion接口和Expression类<br />   Criteria criteria = session.createCriteria(customer.class);<br />   Criterion criterion1 = Expression.like("name","t%");<br />   Criterion criterion2 = Expression.eq("age",new Integer(21));<br />   Critera = criteria.add(criterion1) ;<br />   Critera = criteria.add(criterion2) ;<br />   list result = criteria.list(); <br />   或是： list result = session.createCriteria(Customer.class).add(Expression.eq("this.name","tom")).list(); <br />SQL :  采用HQL和QBC检索时，Hib生成SQL语句适用所有数据库。<br />   Query query  = session.createSQLQuery("select {c.*} from customers c where c.name like : customername " + "and c.age = :customerage","c",customer.calss);<br />   query.setString("customername","tom");<br />   query.setInteger("customerage","21");<br />   list result = query.list();<br />/////////////多态查询<br />   HQL ：session.createQuery("from employee");<br />   QBC ：session.createCriteria(employee.class);<br />   HQL : session.createQuery("from hourlyEmployee");<br />   QBC : session.createCriteria(hourlyEmployee.class);<br />   下面的HQL查询语句将检索出所有的持久化对象：<br />   from java.lang.Object ;<br />   from java.io.serializable ;<br />////////////查询的排序<br />   1'查询结果按照客户姓名升序排列：<br />   HQL ：<br />        Query query = session.createQuery ("from customer c order by c.name");<br />   QBC ：<br />        Criteria criteria = session.createCriteria(customer.class);<br />        criteria.addOrder(order.asc("name"));<br />   HQL :<br />        Query query = session.createQuery ("from customer c order by c.name asc , c.age desc");<br />   QBC :<br />        Criteria criteria = session.createCriteria(customer.class);<br />        criteria.addOrder(order.asc ("name"));<br />        criteria.addOrder(order.desc("age")); <br /><br />        import net.sf.hibernate.pression.Order<br />        import mypack.Order<br />        ...........<br />        Criteria criteria = session.createCritria (mypack.Order.class);<br />        criteria.addOrder(net.sf.hibernate.Order.asc("name"));<br />///////////HQL语句的参数绑定Query接口提供了绑定各种Hib映射类型的方法。<br />        setBinary()<br />        setString()<br />        setBoolean()<br />        setByte()<br />        setCalendar()<br />        setCharacter()<br />        setDate()<br />        setDouble()<br />        setText()<br />        setTime()<br />        setTimestamp()<br />        setEntity()//把参数与一个持久化类的事例绑定lsit result = session.createQuery("from order o where o.customer =            :customer").setEntity("customer" , customer).list ;<br />        setParameter()//绑定任意类型的参数<br />        setProperties()//把命名参数与一个对象的属性值绑定 Query query = session.createQuery("from customer c where c.name =:     name " + "and c.age =:age" );<br />        Query.setProperties(customer);  <br /><table width="98%" border="0"><tbody><tr><td class="text" align="left" width="100%"><br />过滤查询结果中的重复元素 <br />     使用Set集合来去除重复元素；或是使用distinct元素<br />     Iterator iterator = session.createQuery("select distinct c.name from customer ").list().iterator();<br />     while(iterator.hasnext()){<br />           String name = (String) it.next() ;<br />     }<br />///////////使用聚集函数<br />count(); 记录的条数<br />min();   求最小值<br />max();   求最大值<br />avg();   求平均值<br />sum();   求和<br />1'查询customer中的所有记录条数<br />   integer i = (Integer) session.createQuery("select count(*) from customer").uniqueResult();<br />只有在确定只有一个对象时候使用uniqueResult();<br />2'查询customer中的所有客户的平均年龄<br />   integer i = (Integer) session.createQuery("select avg(c.age) from customer c ").uniqueResult();<br />3'查询customer中的客户年龄的最大值、最小值<br />一个数组可以看作一个对象<br />   object [] i = (Integer) session.createQuery("select max(c.age),min(c.age) from customer c ").uniqueResult();<br />   Integer Maxage = (Integer) i [0];<br />   Integer Minage = (Integer) i [1];<br />4'统计customer中的客户的名称数目，忽略重复的姓名<br />   Integer cout = (Integer) session.createQuery("select count(distinct c.name) from customer c").uniqueResult();<br />////////////使用分组查询<br />1'按姓名分组，统计customer中的相同姓名的记录数目<br />   Iterator iterator = (Integer) session.createQuery("select c.name ,count(c) from customer c group by c.name").list.iterator();<br />   while(iterator.hasnext()){<br />         object[] p = (objcet[])iterator.next();<br />         String name = p[0];<br />         Integer cout = p[1];<br />   }<br />2'按客户分组，统计每个客户的订单数量<br />   Iterator iterator = session.crateQuery("select c.id ,c.name , count(o) from customer c join c.order o group by c.id ").list().iterator;<br />   while(iterator.hasnext()){<br />         object[] p = (objcet[])iterator.next();<br />         Integer id = p[0]<br />         String name = p[1];<br />         Integer cout = p[2];<br />   }<br />3'统计每个客户的订单总价<br />   Iterator iterator = session.crateQuery("select c.id ,c.name,sum(o.price) from customer c join c.order o group by c.id").list.iterator();<br />   while(iterator.hasnext()){<br />         object[] p = (objcet[])iterator.next();<br />         Integer id = p[0]<br />         String name = p[1];<br />         Double cout = p[2];<br />   }<br />//////////报表的优化<br />使用HQL时如果只查询对象的一部分属性不会返回持久化对象<br />from customer c join c.order o group by c.age;//返回持久化对象，占用缓存。<br /><br />select c.id , c.name , c.age ,o.id ,o.price from customer c join c.order o group by c.age //返回关系性数据，不占用session的缓存，可以为JVM回收<br /><br />/////////HQL子查询的集合函数属性<br />size() 返回集合中元素的数目<br />minIndex() 建立索引的集合获得最小的索引<br />maxIndex() 建立索引的集合获得最大的索引<br />minElement() 对于包含基本元素的集合获得集合最小的元素<br />maxElement() 对于包含基本元素的集合获得集合最大的元素<br />element() 获得集合中的所有元素<br />///////////Hibernate的缓存管理<br />管理一级缓存，不建议使用下列方法来管理一级缓存<br />evict(Object o)从缓存中清除参数指定的持久化对象<br />clear()清空缓存中所有的持久化对象<br />///////////批量更新和批量删除<br />批量更新customer表中的年龄大于零的所有记录的AGE字段：<br />    tx = session.beginTransaction();<br />    Iterator customer = session.find("from customer c where c.age &gt; 0").iterator();<br />    while(iterator.hasnext()){<br />        customer customer = (customer) customer.next();<br />        customer.setAge(customer.getAge()+1);<br />    }<br />    tx.commit();<br />    session.close();//上述代码对数据库操作效果不好可以使用下列的JDBCAPI直连<br />   <br />    tx = session.beginTranscation();<br />    Connection conn = session.connection();<br />    Preparedstatement ps = conn.preparedstatment("update customer set age = age + 1 where age &gt; 0 ");<br />    ps.executeupdate();<br />    tx.commit(); </td></tr></tbody></table><img src ="http://www.blogjava.net/dragonofson/aggbug/53788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dragonofson/" target="_blank">Dragonofson</a> 2006-06-19 14:56 <a href="http://www.blogjava.net/dragonofson/articles/53788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>