如何通过Hibernate访问Oracle DB返回最大身份列



由于HQL(createQuery)似乎不支持标量查询,我通过createSQLQuery使用了原始查询:

        session.beginTransaction();
        Query query = session.createSQLQuery("select nvl(max(id), 0) + 1  from empty_table_for_now");
        session.getTransaction().commit();
        List listL = query.list();
        Iterator iterator = listL.iterator();
        while (iterator.hasNext()) {
            LOG.info("Infinite loop. This is disgusting!");
        }           

查询本身不会失败,但它似乎返回了一个包含无限数量结果的列表?这没有意义...知道我为什么得到这个吗?

更好的是,有没有一种更好、更优雅的方式来获取预期的标量,而不必将维护我的代码的人与"列表"(应该始终包含一个元素)混淆?

如果你不移动迭代器,循环肯定是无限的(只要至少有一个元素)。

使用 Iterator.next() 移动迭代器

while (iterator.hasNext()) {
    Object nextElement = iterator.next();
    LOG.info("Next element is: " + nextElement);
} 

也许你在编写代码时想到了一个 ResultSet.next(),但迭代器是不同的。看看javadocs。

使用

Oracle DB 时,我建议使用序列。

要使序列正常工作,您应该在映射文件中定义列和序列名称,Hibernate将完成获取下一个序列值的工作。

仅供参考:SQL Server - 使用标识进行自动增量MySQL/Maria DB - 使用自动增量PostgreSQL - 使用序列或替代..PostgreSQL Autoincrement

警告:尝试在列中找到最大值并将其弹跳是不可接受的设计。

最新更新