簡體   English   中英

使用groupProperty和count的帶有子查詢的復合Hibernate查詢

[英]Composite Hibernate query with subquery using groupProperty and count

我陷入了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地址,其userId和articleId的日志將被記錄到databse中。 我要達到的目標是獲取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,但我不知道如何。 有人可以給我一點提示嗎?

非常感謝,Ondrej :)

編輯:由於我的朋友和這個線程休眠標准訂購者 ,我找到了解決方案。 也許這不是最好,最簡潔的方法,如果您有更好的想法,請在此處寫下。 但目前,它是有效的解決方案:)

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 []中,articleId在索引0上,出現次數在索引1上。

翁德里

這個想法是使用計數來排序

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM