从休眠表中获取最大值记录
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_sql
、format_sql
和 use_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)
以上是关于从休眠表中获取最大值记录的主要内容,如果未能解决你的问题,请参考以下文章