0

私は Hibernate クエリで立ち往生していて、助けを求めています :) 私のシナリオでは、ユーザーが行ったさまざまなアクションが記録されるサーバー ログのテーブルがあります。

CREATE TABLE log (
    id VARCHAR(12) NOT NULL ,
    type INT(2) NOT NULL ,
    userId VARCHAR(12) NULL ,
    articleId VARCHAR(12) NULL ,
    date DATETIME NOT NULL ,
    ip VARCHAR(40) NULL ,
    description VARCHAR(999) NULL ,
    PRIMARY KEY (id) )
DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci;

ユーザーが記事を読むと、IP アドレス、ユーザー ID、記事 ID を含むログがデータベースに書き込まれます。私が到達しようとしている目的はArticle、特定のユーザーが最も多く開いた を取得することです。

UserIdtypeクエリが処理されているときに認識されます。このようなコードを作成できましたが、機能しないことはわかっています。

DetachedCriteria subquery = DetachedCriteria.forClass(Log.class)
                .add(Restrictions.eq("userId", uId))
                .add(Restrictions.eq("type", type))
                .setProjection(Projections.projectionList()
                    .add(Projections.groupProperty("articleId")));
Article art = (Article) session.createCriteria(Article.class)
                .add(Subqueries.propertyIn("articleId", subquery))
                .uniqueResult();

Log テーブルの最大出現回数で articleId を取得するには、別のプロジェクションを追加する必要がありますが、その方法がわかりません。誰かが私に少しヒントを与えることができますか?

どうもありがとう、オンドレイ:)

編集:私の友人とこのスレッドHibernate Criteria Order By のおかげで、解決策が見つかりました。たぶん、それは最善かつ最もクリーンな方法ではないので、より良いアイデアがあれば、ここに書き込んでください。しかし、今のところ、それは機能するソリューションです:)

Object[] o = (Object[])session.createCriteria(Log.class)
                .add(Restrictions.eq("userId", uId))
                .add(Restrictions.eq("userId", Log.TYPE_ARTICLE_READ))
                .setProjection(Projections.projectionList()
                    .add(Projections.groupProperty("articleId"))
                    .add(Projections.count("LogId"), "count"))
                .addOrder(Order.desc("count"))
                .setMaxResults(1)
                .uniqueResult();
session.clear();
art = (Article) session.createCriteria(Article.class)
                .add(Restrictions.eq("articleId", o[0]))
                .uniqueResult(); 

オブジェクト配列 o[] は、インデックス 0 の articleId とインデックス 1 の出現回数です。

オンドレイ

4

1 に答える 1

0

アイデアはそれを注文するためにカウントを使用することです

DetachedCriteria subquery = DetachedCriteria.forClass(Log.class)
    .add(Restrictions.eq("userId", uId))
    .add(Restrictions.eq("type", type))
    .addOrder(Order.desc(Projections.rowCount()))
    .setProjection(Projections.groupProperty("articleId"))
    .setMaxResults(1);

Article art = (Article) session.createCriteria(Article.class)
    .add(Subqueries.propertyEq("articleId", subquery))
    .uniqueResult();
于 2012-09-14T06:28:22.180 に答える