2014-11-10 3 views
1

PartnerVisit의 두 테이블이 있습니다. 파트너는 많은 방문을 가질 수 있으며, 같은 날에도 다양한 방문을 할 수 있습니다. Partner에 주어진 날짜 이후로 방문이 몇 번 있었는지 알고 싶다면 Criteria 제한을 만들어야합니다. 따라서 동일한 날짜에 2 번 이상 방문하는 경우는 하나만 있어야합니다.기준 날짜 별 제한 사항

CriteriaRestrictions으로 만 수행 할 수 있습니까 ??

나는 같은 기준 날짜로부터 모든 방문 얻을 수 있습니다 :

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

어떤 생각을?

편집 : 파트너 1 관련 user23123412 @netik

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 수는있다 일 주어진 된 이후 date 주어진.

즉 : 내가 visitor = 1startDate = 12/10/2014 결과에 쿼리를 실행하면 MUST가 하루 만 그래서 2, 원인 행 id = 45id = 71가하는 같은 날 다른 방문이 될.

+0

예, 기준을 사용하여이를 수행 할 수 있습니다. JPA에 oneToMany 관계가 있습니까? – user23123412

+0

예, 'OneToMany' 관계는 여러 개의'방문 '을 가질 수있는'파트너 '에 있습니다.하지만 여기서는 중요하지 않습니다.'날짜 '는'파트너 '와 관계가 없으므로 여러 시간으로 여러 번 반복 할 수 있습니다. –

+0

달성하고자하는 데이터베이스 쿼리를 생성 할 수 있습니까? – user23123412

답변

5

당신은 세 가지 옵션이 있습니다 : 당신이 Critera API를 고정하지 않을 경우

1), 내가 대신 기준 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) 기준 API를 사용하려는 경우의 HQL을 사용하는 것이 좋습니다, sqlRestriction을 적용 할 수 있습니다. 불행히도 특정 데이터베이스를 잠글 것입니다. 마지막으로 ... 이 예는 순수한 기준 API를 사용하는 것도 가능)

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 HSQLDB

에 작동하지만, 날짜 제한 (

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

늦은 대답에 대한 죄송합니다. @ netik –

+0

첫 번째 옵션을 사용하려고하는데,'MySQLSyntaxErrorException' 원인이'trunc'을 인식하지 못합니다 ... –

1

음) 제한 사이에 사용하여 조금 해킹해야합니다 , 거의 미친 후에, 나는 몇 가지 수정 사항으로 @netik 첫 번째 솔루션을 사용하여 내 쿼리에 대한 해결책을 찾았습니다. 문제가 발견되었습니다. mysqltrunc을 지원하지 않았습니다. 상관없이 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!