从休眠表中获取最大值记录

Posted

技术标签:

【中文标题】从休眠表中获取最大值记录【英文标题】:get max value record from table in hibernate 【发布时间】:2010-09-18 21:59:01 【问题描述】:

如何在hibernate中从表中获取最大值记录?

【问题讨论】:

【参考方案1】:

你可以使用投影:

Criteria criteria = session
    .createCriteria(Person.class)
    .setProjection(Projections.max("age"));
Integer maxAge = (Integer)criteria.uniqueResult();

【讨论】:

Criteria criteria = getSession() .createCriteria(Borrower.class) .setProjection(Projections.max("brwrid")); Long maxBrwrid = (Long)criteria.uniqueResult(); 它工作正常。但是返回null值,如果null返回set value是1 else max+1,怎么办。 if (maxBrwrid == null) maxBrwrid = 1; else maxBrwrid = maxBrwrid + 1; 获取感兴趣字段的最大值,而不是包含最大值的记录(对象)。 请满足我的需要,您可以使用if (maxBrwrid == null) maxBrwrid = 1; else maxBrwrid = maxBrwrid + 1; 作为@Darin Dimitrov 编辑和改进答案【参考方案2】:

AFAIK,Projections 只会检索您想要的列的子集(或者它只是一列?)。

如果你的数据对象是这样的:

class Person 
    private String id;
    private String name;
    private int age;
    ...

并且想要表中最年长的人,以下似乎可行:

...
Person oldest = 
    (Person) session.createCriteria(Person.class)
    .addOrder(Order.desc("age"))
    .setMaxResults(1)
    .uniqueResult();
...

Hibernate 日志(show_sqlformat_sqluse_sql_comments 均设置为 true)显示

select
    *
from
    ( /* criteria query */ select
        this_.ID as ID1_12_0_,
        this_.NAME as NAME_12_0_,
        this_.AGE as AGE_12_0_
    from
        PERSON this_
    order by
        this_.AGE desc )
where
    rownum <= ?

这似乎是正确的。请注意,这是在带有 Oracle 11 XE 的 Hibernate 3.3.2 上。

【讨论】:

谢谢,sql 看起来很完美。 我认为这不是一个好的解决方案。因为您必须对所有记录进行排序才能找到最老的 Person。此解决方案可能会导致大型表出现性能问题。【参考方案3】:

使用max(...)聚合函数:

select max(cat.weight) from Cat cat

参考

Hibernate 核心参考指南 14.7. Aggregate functions

【讨论】:

【参考方案4】:

你可以使用子查询:

SELECT * FROM Employee WHERE age IN (SELECT MAX(age) age FROM Employee)

【讨论】:

我猜最后出现的“年龄”是一个错字。FROM Employee WHERE age IN (SELECT MAX(age) FROM Employee)

以上是关于从休眠表中获取最大值记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.net MVC C# 中使用 Linq 从多个表中选择具有最大计数值的记录

如何从SQL表中删除不是组的最大值的记录[重复]

SQL Server如何优化获取具有最大值的相关记录的查询

如何在包含最大值的表中找到记录?

使用特定逻辑从连接表中获取最大值

从多个表中获取所有列的最大值