我被我的 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 的日志被写入数据库。我试图达到的目标是 get 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 :)
编辑: 感谢我的朋友和这个线程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 上的出现次数。
翁德雷