Java (结果);
这样做的好处是可以显式地告诉hibnerate,您只对结果集的“id”列感兴趣,并且hibernate需要显式地将返回的对象转换为BigDecimal,JDBC驱动程序是否应该决定使用其他类型作为默认值更合适。您使用的是哪个hibernate版本?@SternK hibernate version 5.2.18尝试使用BigIntegerinstead@GuilhermeAlencar不幸的是,将Java (结果);,java,oracle,hibernate,pagination,entitymanager,Java,Oracle,Hibernate,Pagination,Entitymanager,这样做的好处是可以显式地告诉hibnerate,您只对结果集的“id”列感兴趣,并且hibernate需要显式地将返回的对象转换为BigDecimal,JDBC驱动程序是否应该决定使用其他类型作为默认值更合适。您使用的是哪个hibernate版本?@SternK hibernate version 5.2.18尝试使用BigIntegerinstead@GuilhermeAlencar不幸的是,将列表更改为列表结果,不会改变任何内容。奇怪的是,result对象仍然具有与上面第二个屏幕截图中相同的
列表
更改为列表结果
,不会改变任何内容。奇怪的是,result
对象仍然具有与上面第二个屏幕截图中相同的大小数。我的建议是在分配给列表之前调试getResultList的结果。要想知道问题是对对象的解组还是查询本身。我之所以使用本机查询,是因为我必须执行一个复杂的查询。查询在第一页返回一种类型的结果,而在第二页返回另一种类型的结果,这种行为非常令人费解,特别是如果这种行为没有文档记录,并且不能在其他查询中重现。我复制了与您公开的完全相同的行为(本机查询通过实体管理器分页的大小数列表)。它在第一页或第二页正常工作。我告诉您问题出在您的查询上,或者可能在存储的数据中,如果您希望我或任何人提供更多信息,您应该提供更多信息。这就是我的问题,祝您好运!我最后的猜测是,您的列数据库的比例可能与hibernate和可能是这造成了这种混乱。我感谢您的努力和支持。不幸的是,到目前为止似乎没有任何帮助。我创建了一个示例项目来重现这个问题。您可以在这里找到:这里的问题是数据库方言。这个问题无法使用H2(或hsql、或mysql、或db2或postgres)重现-这是oracle的一项功能。使用任何其他方言或数据库进行测试都会适得其反,并导致错误的结论和讨论,因为最初问题中提供的代码几乎适用于除oracle之外的所有数据库(他在这里使用的是oracle)在这个新的spring数据版本中,您有什么hibernate版本?您使用的hibernate方言到底是什么?hibernate版本5.2.18.Final
,和hibernate方言org.hibernate.dialogue.Oracle10gDialogue
恐怕这个问题仍然存在。实际上您在CustomerRepository
中的查询与此问题。您可以将其简化为@Query(value=“SELECT SHOP\u ID FROM CUSTOMER”,nativeQuery=true)pagefind合同已删除(Pageable Pageable)
唯一重要的是:您的查询返回一列,但由于与分页相关的查询修改,这一事实发生了更改,并返回了两列,正如我在回答中所说的。这就是问题所在。人们很难相信oracle方言实际上会导致在所有f选定的列。
var query = em.createNativeQuery("select distinct id from ... group by ... having ...");
List<BigDecimal> results = query
.setMaxResults(pageSize)
.setFirstResult(pageNumber * pageSize)
.getResultList();
@Test
public void shouldGetListOfSalaryPaginated() {
// given
Person alex = new Person("alex");
alex.setSalary(BigDecimal.valueOf(3305.33));
Person john = new Person("john");
john.setSalary(BigDecimal.valueOf(33054.10));
Person ana = new Person("ana");
ana.setSalary(BigDecimal.valueOf(1223));
entityManager.persist(alex);
entityManager.persist(john);
entityManager.persist(ana);
entityManager.flush();
entityManager.clear();
// when
List<BigDecimal> found = entityManager.createNativeQuery("SELECT salary FROM person").setMaxResults(2).setFirstResult(2*1).getResultList();
// then
Assertions.assertEquals(found.size(), 1);
Assertions.assertEquals(found.get(0).longValue(), 1223L);
}
Hibernate:
/* dynamic native SQL query */
select test_id from TST_MY_TEST
OFFSET ? ROWS FETCH NEXT ? ROWS ONLY
val = 3
val = 4
val = 5
val = 6
val = 7
NativeQuery query = session.createNativeQuery(
"select test_id from TST_MY_TEST FOR UPDATE OF test_id"
).setMaxResults(5).setFirstResult(2);
ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.
List<BigDecimal> results = entitymanager.createNativeQuery("select distinct id from ... group by ... having ...")
.unwrap(org.hibernate.query.NativeQuery.class)
.addScalar("id", BigDecimalType.INSTANCE)
.getResultList();
System.out.println(results);