寻呼原生SQL查询中JPA与Hibernate没有错误的关注
问题描述:
感谢,并为MI英语遗憾:S寻呼原生SQL查询中JPA与Hibernate没有错误的关注
我使用JPA 2.0与Hibernate 4.X做一些SQL本机查询。特码是很简单的:
private void doIt() throws Exception {
EntityManager em = getEntityManager();
Query q = em.createNativeQuery("A very simple native query, which return no entities, but collections of arrays");
q.setFirstResult(0);
q.setMaxResults(5);
Collection<Object> results = q.getResultList();
System.out.println("1"); //Means page 1
for (Object elem : results) {
String line = "";
Object[] row = (Object[]) elem;
for (Object object : row) {
if(object==null){
object="null";
}
line += object +"("+object.getClass()+")"+ ",";
}
System.out.println(row.length + " " + line);
}
em = getEntityManager();
q = em.createNativeQuery("The same simple native query, which return no entities, but collections of arrays");
q.setFirstResult(5);
q.setMaxResults(5);
results = q.getResultList();
System.out.println("2"); //Means page 2
for (Object elem : results) {
String line = "";
Object[] row = (Object[]) elem;
for (Object object : row) {
if(object==null){
object="null";
}
line += object +"("+object.getClass()+")"+ ",";
}
System.out.println(row.length + " " + line);
}
em = getEntityManager();
q = em.createNativeQuery("The same simple native query, which return no entities, but collections of arrays");
q.setFirstResult(10);
q.setMaxResults(5);
results = q.getResultList();
System.out.println("3"); //Means page 3
for (Object elem : results) {
String line = "";
Object[] row = (Object[]) elem;
for (Object object : row) {
if(object==null){
object="null";
}
line += object +"("+object.getClass()+")"+ ",";
}
System.out.println(row.length + " " + line);
}
}
我的结果是这样的:
1
data1,data2,...,data-n -->I need this output
data1,data2,...,data-n
data1,data2,...,data-n
data1,data2,...,data-n
data1,data2,...,data-n
2
data1,data2,...,data-n,6 -->OMG! lol
data1,data2,...,data-n,7
data1,data2,...,data-n,8
data1,data2,...,data-n,9
data1,data2,...,data-n,10
3
data1,data2,...,data-n,11
data1,data2,...,data-n,12
data1,data2,...,data-n,13
data1,data2,...,data-n,14
data1,data2,...,data-n,15
总之,在第一页的输出有每行n项(这是我所希望输出),但第二第三页有n + 1个项目,而附加项目似乎是所带行的编号。
有人发生过同样的事情吗?我在Hibernate的文档中搜索过,但是我无法解决这个“有趣:@”的问题。
此代码与Toplink一起执行,它没有问题。
非常感谢! :)
答
这是分页在Hibernate中完成的方式 - 使用其Dialect
实现。 Dialect的API如下所示:它需要SQL查询分页和范围信息,并生成产生期望行范围的SQL语句。
如果是Oracle语言或Oracle语言,它可以使用ROWNUM
并且不需要修改原始查询。在例如DB2或SQL Server一种方言需要显着改变您的查询(包括但不限于在输出中添加额外的列),以便能够为您过滤期望的范围。
最后一件事 - 为什么你的第一页或结果是不同的。 SQL允许(取决于实现)构造如SELECT TOP n
,因此范围[0, n]
和[m, n]
的查询通常是不同的。