JPA分页的有关问题?感觉效率不行
JPA分页的问题?感觉效率不行
上面是网上查到JPA分页的例子,发现JPA分页有2个缺陷
1. 类似于上例,用query.setFirstResult(5);query.setMaxResults(2)是想找第5--7条
虽然结果正确,但看了log中的sql,竟然是select top 7 然后返回第6,7两条。而我们自己写sql则是可通过一定的写法直接返回第6.7条。 如果数据量大JPA且不是要查询装载很多额外的数据?
2. 用该方法查找出来的无法缓存?
请问是这样吗,有没有更好的办法?
如例子中如果不用em.clear会有什么副作用?
------解决方案--------------------
OK,用的sqlserver,让我们来看看hibernate3.3中SqlServerDialect是怎么处理分页的
- Java code
public List getPersonList(int max, int whichpage) { try { int index = (whichpage - 1) * max; Query query = em.createQuery("from Person p order by personid asc"); List list = query.setMaxResults(max).setFirstResult(index).getResultList(); em.clear();// 分离内存中受EntityManager管理的实体bean,让VM进行垃圾回收 return list; } catch (Exception e) { e.printStackTrace(); return null; } }
上面是网上查到JPA分页的例子,发现JPA分页有2个缺陷
1. 类似于上例,用query.setFirstResult(5);query.setMaxResults(2)是想找第5--7条
虽然结果正确,但看了log中的sql,竟然是select top 7 然后返回第6,7两条。而我们自己写sql则是可通过一定的写法直接返回第6.7条。 如果数据量大JPA且不是要查询装载很多额外的数据?
2. 用该方法查找出来的无法缓存?
请问是这样吗,有没有更好的办法?
如例子中如果不用em.clear会有什么副作用?
------解决方案--------------------
OK,用的sqlserver,让我们来看看hibernate3.3中SqlServerDialect是怎么处理分页的
- Java code
public String getLimitString(String querySelect, int offset, int limit) { if ( offset > 0 ) { throw new UnsupportedOperationException( "query result offset is not supported" ); } return new StringBuffer( querySelect.length() + 8 ) .append( querySelect ) .insert( getAfterSelectInsertPoint( querySelect ), " top " + limit ) .toString(); }