私は 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
、特定のユーザーが最も多く開いた を取得することです。
UserId
type
クエリが処理されているときに認識されます。このようなコードを作成できましたが、機能しないことはわかっています。
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 の出現回数です。
オンドレイ