由于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!");
}
查询本身不会失败,但它似乎返回一个无限结果数量的列表?这没有意义......我知道为什么会这样做?
更好的是,是否有更好,更优雅的方式来获得预期的标量,而不必混淆维护我的代码的人与“列表”(应该始终包含一个元素)?
答案 0 :(得分:5)
如果不移动迭代器,则循环肯定是无限的(只要至少有一个元素)。
移动迭代器while (iterator.hasNext()) {
Object nextElement = iterator.next();
LOG.info("Next element is: " + nextElement);
}
在编写代码时,也许你有ResultSet.next(),但迭代器是不同的。看看javadocs。
答案 1 :(得分:4)
使用Oracle DB时,我建议使用序列。
要使序列生效,您应该在映射文件中定义列和序列名称,Hibernate将负责获取下一个序列值。
供参考: SQL Server - 使用Identity进行自动增量 MySQL / Maria DB - 使用自动增量 PostgreSQL - 使用序列或者.. PostgreSQL Autoincrement
警告:尝试在列中找到最大值并将其弹起是不可接受的设计。