使用groupProperty和count的子查询的复合Hibernate查询

时间:2012-09-13 06:49:03

标签: java mysql hibernate

我坚持使用我的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的日志会写入数据库。我想要达到的目标是获得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:)

编辑: 感谢我的朋友和这个帖子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上的出现次数。

Ondrej

1 个答案:

答案 0 :(得分:0)

这个想法是使用计数来订购它

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