Java (结果);

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对象仍然具有与上面第二个屏幕截图中相同的

这样做的好处是可以显式地告诉hibnerate,您只对结果集的“id”列感兴趣,并且hibernate需要显式地将返回的对象转换为BigDecimal,JDBC驱动程序是否应该决定使用其他类型作为默认值更合适。

您使用的是哪个hibernate版本?@SternK hibernate version 5.2.18尝试使用BigIntegerinstead@GuilhermeAlencar不幸的是,将
列表
更改为
列表结果
,不会改变任何内容。奇怪的是,
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);