关于java:如何通过Hibernate访问Oracle DB返回最大标识列?

How to return max of identity column via Hibernate accessing Oracle DB?

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

1
2
3
4
5
6
7
8
9
        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()移动迭代器

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

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


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

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

供参考:
SQL Server - 使用Identity进行自动增量
MySQL / Maria DB - 使用自动增量
PostgreSQL - 使用序列或者..
PostgreSQL自动增量

警报:试图找到列中的最大值并将其弹起是不可接受的设计。