0

私は再び冬眠するのはかなり初めてなので、これは初歩的な質問かもしれません;)。

to_days がなくても、タイムスタンプでクラスター化すると、次のように機能します。

    CriteriaQuery<Tuple> query = criteriaBuilder.createQuery(Tuple.class);
    Root<Session> sessionRoot = query.from(Session.class);
    query.multiselect(
                sessionRoot.get("time").alias("time"),
                criteriaBuilder.count(sessionRoot).alias("count")
            );
    query.groupBy(sessionRoot.get("time"));
    List<Tuple> results = this.executeQuery(query);

だから私は受け取ります:

time|count
13721938721|1
13721938722|2
13721938723|3
13721938724|4
13721938725|2
13721938726|1
13721938727|4

しかし、これはすべてミリ秒ごとのセッション数ですが、タイムスタンプではなく日ごとにクラスター化されたものが必要です。したがって、プレーンな mysql で to_days を使用します。

mysql では、次のクエリを実行します。

SELECT TO_DAYS(`time`) AS `days`, COUNT(*) as `count` FROM sessions WHERE 1 GROUP BY `days`

これは私に与えます:

days|count
777594|123
777595|60
777596|61
777597|74

しかし、私にはまだわかりません。休止状態で javax.persistence.criteria.CriteriaBuilder と CriteriaQuery を使用して同じことを達成する方法は?

4

2 に答える 2

0

私は基準ビルダーでそれを行う方法を知りませんが、Hibernate 4 基準 API での方法は知っています:

query.setProjection(
    Projections.sqlProjection(
        "TO_DAYS(time) as days",
        new String[]{"days"},
        new Type[]{StandardBasicTypes.INTEGER}
    )
);

sqlProjection を使用すると、データ型をキャストまたは変換できますが、注意してください。プロジェクションを使用すると、指定したフィールドのみが取得され、結果のリストは次のようになります。

 List<Object[]> results = this.executeQuery(query);

ただし、結果トランスフォーマーを使用して、hibernate にプロパティとのエイリアス マッチを実行させることができます。

query.setResultTransformer(new AliasToBeanResultTransformer(Session.class));

通常のようにリストが表示されます。

List<Session.class> results = this.executeQuery(query);

申し訳ありませんが、criteriaBuilder ソリューションを提供できませんでしたが、これが正しい方向に進むことを願っています。

于 2013-05-10T23:04:11.907 に答える