休眠标准分组最大值

时间:2013-02-06 02:14:32

标签: hibernate criteria

我正在尝试为日期实现组智能最大值,但即使日志显示正确的查询,我也得到例外:

java.lang.ClassCastException : java.lang.String cannot be cast to java.util.Date

这是生成强制转换异常的最小代码部分:

DetachedCriteria maxLogin= DetachedCriteria.forClass(UsersSessions.class,"du");
maxLogin.setProjection(Projections.projectionList()
    .add(Projections.max("du.login").as("login")));

Criteria crit = session.createCriteria(UsersSessions.class,"u");
crit.add(Subqueries.eq("u.login", maxLogin));

这是我用我的完整代码尝试的sql等价物:

SELECT *
FROM   UsersSessions u
WHERE  u.login=(SELECT MAX(du.login)
              FROM UsersSessions ud
              WHERE ud.fkUser = u.fkUser);

这会更好:

SELECT *
FROM (SELECT *
FROM UsersSessions 
[WHERE conditions]
ORDER BY login  DESC) u
GROUP BY u.fkUser

但是idk如何在from部分做一个子查询......

编辑:好的,刚尝试将maxLogin投射到日期,但我得到同样的例外。

编辑:我刚试过这个

Criteria crit = session.createCriteria(UsersSessions.class,"u");
crit.setProjection(Projections.projectionList()
        .add(Projections.max("u.login").as("login")));
Timestamp max=(Timestamp)crit.uniqueResult();

它有效。

离开我的地方甚至更少...... cero此刻。 有什么想法导致演员除外?

2 个答案:

答案 0 :(得分:0)

您确定crit.add(Subqueries.eq("u.login", maxLogin)); maxLogin是日期类型吗?如果没有,请尝试将其转换为java.lang.Date类型。

答案 1 :(得分:0)

搞定了......

显然,eq函数将字符串作为比较值。

Subqueries.eq("u.login", maxLogin);

这是将属性与子查询进行比较的那个:

Subqueries.propertiesEq(new String[]{"u.login"},maxValidacion);
相关问题