![](/img/trans.png)
[英]How to use a subquery instead of a joined query to get correct count with 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
,它是某些用戶最多時間打開的。
處理查詢時,用戶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,但我不知道如何。 有人可以給我一點提示嗎?
非常感謝,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.