![](/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.