0

日付のグループごとの最大値を達成しようとしていますが、ログに正しいクエリが表示されていても、例外が発生します:

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

しかし、そのような部分でサブクエリを実行する方法はわかりませんfrom...

編集:OK、日付にキャストしようとmaxLoginしましたが、同じ例外が発生しています。

編集:私はこれを試しました

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

そしてそれはうまくいきました。

見る場所がさらに少なくなりました...現時点ではセロ。キャスト例外の原因についてのアイデアはありますか?

4

2 に答える 2

0

動作しました...

どうやら、eq関数は文字列を比較の値として受け取ります。

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

これは、プロパティをサブクエリと比較するものです。

Subqueries.propertiesEq(new String[]{"u.login"},maxValidacion);
于 2013-02-06T18:13:56.650 に答える
0

crit.add(Subqueries.eq("u.login", maxLogin));maxLogin が Date 型であると確信していますか? そうでない場合は、java.lang.Date 型に変換してみてください。

于 2013-02-06T02:25:19.003 に答える