投影查询——过滤部分字段
返回的List集合元素为Object[]
1Query query = session.createQuery("select c.cname, c.csex from Customer c"); 2List list = query.list(); 3Iterator iter = list.iterator(); 4Object[] objs = null; 5while(iter.hasNext()){ 6objs = (Object[]) iter.next(); 7for(int i = 0; i < objs.length; i ++){ 8System.out.println(objs[i]); 9System.out.println("-------------------");
分页查询
返回的list集合元素是Object
1 Query query = session.createQuery("SELECT c FROM Customer c left join c.orders o where c.id=1"); 2 query.setMaxResults(2);//设置每次查询最多查询多少记录,简单来说就是页大小 3 query.setFirstResult(2);//设置每次查询的开始位置, 4 Iterator iter = query.list().iterator(); 5 while (iter.hasNext()) { 6 System.out.println(((Customer)iter.next())); 7 }
批量处理
1 @Test 2 public void testBatchDealWith(){ 3 for(int i = 0; i <10000; i ++){ 4 Customer customer=new Customer(); 5 customer.setCustomerName("jeremy"+i); 6 session.save(customer); 7 if(i==20||i==40){ 8 System.out.println("--------------------------"); 9 } 10 } 11 }
因为默认情况下,Hibernate会缓存所有的持久对象在session级别的缓存,并最终应用程序会失败并发生OutOfMemoryException某处50,000条记录左右。如果使用的是批量处理与Hibernate解决这个问题。
要使用批量处理功能,首先设置hibernate.jdbc.batch_size为批量大小若干无论是在20或50根据对象的大小。这将告诉每X行插入批次hibernate的容器。为了实现这个在代码中,我们需要做一点修改如下:
1@Test 2public void testBatchDealWith(){ 3 4 for(int i = 0; i <10000; i ++){ 5 Customer customer=new Customer(); 6 customer.setCustomerName("jeremy"+i); 7 session.save(customer); 8 if(i==50){ 9 session.flush(); 10 session.clear(); 11 } 12 } 13} 14 15<property name="hibernate.jdbc.batch_size">20</property>
这样运行速度会得到很好的提升