标准限制按日期字段

时间:2014-11-10 21:16:08

标签: java hibernate criterion

我有2个表,PartnerVisit。合作伙伴可以在同一天进行多次访问。 我需要创建一个Criteria限制,以了解自{@ 1}}以来有多少访问次数。因此,同一日期的2次或多次访问必须只有一次。

这只能由PartnerCriteria ??

完成

我可以通过以下标准获取所有访问次数:

Restrictions

但是现在,为了过滤重复的日子,我需要像:

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

有什么想法吗?

编辑: @ user23123412 @netik

criteria.add(Restrictions.unique(DBConstants.VISIT_COL_DATE));
与合作伙伴1相关的

Visit.java private Integer id; private Date date; private Partner visitor; // getters + setters 表行:

Visit

查询后我需要的答案是不同日期的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

IE:如果我使用datevisitor = 1启动查询,结果必须为2,则导致行startDate = 12/10/2014id = 45有所不同在同一天访问,所以它只有一天。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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!