1

我有 2 张桌子,Partner并且Visit. 一个合作伙伴可以有很多次访问,也可以在同一天进行多次访问。我需要创建一个限制以了解自给定日期以来访问了Criteria多少天。Partner因此,同一日期的 2 次或多次访问必须只有 1 次。

这只能由Criteriaand完成Restrictions吗?

我可以从具有以下条件的日期获得所有访问:

Criteria criteria = buildCriteria();
criteria.add(Restrictions.eq(DBConstants.VISIT_COL_VISITOR, partnerVisitor));
criteria.add(Restrictions.ge(DBConstants.VISIT_COL_DATE, startDate));

但是现在,要过滤重复的日子,我需要类似的东西:

criteria.add(Restrictions.unique(DBConstants.VISIT_COL_DATE));

任何想法?

编辑: @user23123412 @netik

Visit.java

private Integer id;
private Date date;
private Partner visitor;

// getters + setters

Visit与合作伙伴 1 相关的表行:

ID  VISITOR DATE
1   1       10/10/2014 16:20
20  1       10/10/2014 18:00
45  1       12/10/2014 16:20
71  1       12/10/2014 19:40
89  1       16/10/2014 11:20

查询后我需要的答案是Visit自给定.date

IE:如果我启动一个查询visitor = 1并且startDate = 12/10/2014结果必须是 2,导致行id = 45并且id = 71在同一天有不同的访问,所以它只有一天。

4

2 回答 2

6

你有三个选择:

1)如果您没有固定到 Critera api,我建议使用 HQL 而不是 Criteria API

Date d =  new SimpleDateFormat("yyyy-MM-dd").parse("2014-10-12");
Query query = session.createQuery("select count(*) from Visit v where trunc(v.date)=:date and v.visitor.id=:visitorId");
query.setParameter("date", d);
query.setParameter("visitorId", 1L);
Long count =  (Long) query.uniqueResult();

2) 如果要使用 Criteria API,可以应用 sqlRestriction。不幸的是,您将锁定到特定的数据库。此示例适用于 HSQLDB

Date d =  new SimpleDateFormat("yyyy-MM-dd").parse("2014-10-12");
Long count = (Long) session.createCriteria(Visit.class)
           .setProjection(Projections.rowCount())
           .add(Restrictions.eq("visitor.id", 1L))
           .add(Restrictions.sqlRestriction("trunc(date)=?", d, org.hibernate.type.StandardBasicTypes.DATE))
           .uniqueResult()  ;

3) 也可以使用纯标准 API,但日期限制必须有点黑客(使用限制之间)

Date d =  new SimpleDateFormat("yyyy-MM-dd").parse("2014-10-12");
Date maxDate = new Date(d.getTime() + TimeUnit.DAYS.toMillis(1));
Long count = (Long) session.createCriteria(Visit.class)
                .setProjection(Projections.rowCount())
                .add(Restrictions.eq("visitor.id", 1L))
                .add(Restrictions.between("date", d, maxDate))
                .uniqueResult();
于 2014-11-11T20:14:34.160 回答
1

好吧......最后,在几乎发疯之后,我找到了使用@netik 第一个解决方案并进行了一些修改的查询解决方案:我发现问题mysql是不支持trunc。无所谓hql

所以最后数据处理后的查询方法是这样的:

public Integer getPartnerVisitDatesSinceDate(Date startDate, Long partnerId) {
    Query query = getSession().createQuery("select count(distinct visit.date) from Visit visit where date(visit.date) >= :date and visit.visitor.id = :visitorId");
    query.setDate("date", startDate);
    query.setParameter("visitorId", partnerId);
    return (Integer) query.uniqueResult();
}

谢谢@netik!

于 2014-11-19T22:54:48.267 回答