我有2个表,Partner
和Visit
。合作伙伴可以在同一天进行多次访问。
我需要创建一个Criteria
限制,以了解自{@ 1}}以来有多少天访问次数。因此,同一日期的2次或多次访问必须只有一次。
这只能由Partner
和Criteria
??
我可以通过以下标准获取所有访问次数:
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:如果我使用date
和visitor = 1
启动查询,结果必须为2,则导致行startDate = 12/10/2014
和id = 45
有所不同在同一天访问,所以它只有一天。
答案 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!