2014-11-10 7 views
1

У меня есть 2 стола, Partner и Visit. У партнера может быть много посещений, а также разных в тот же день. Мне нужно создать Criteria ограничение какое количество голосов дней () Partner посещения с указанной даты. Таким образом, два или более посещений в одну и ту же дату должны быть только одним.Критерии Ограничение по дате поля

Это можно сделать только Criteria и 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)); 

Любая идея?

EDIT: @ 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.

т.е .: Если я запустить запрос с visitor = 1 и startDate = 12/10/2014 результатом MUST быть 2, потому что ряд id = 45 и id = 71 разные визиты в той же день, так что это только один день.

+0

Да, вы можете достичь этого, используя критерии, есть ли у вас одно отношение к вашей JPA? – user23123412

+0

Да, 'OneToMany'relationship находится в' Partner', который может иметь много «посещений» ... но здесь это не важно, 'Date' не имеет отношения к' Partner' и может повторяться несколько раз с разным часом. . –

+0

вы можете создать запрос к базе данных, который вы хотите достичь? – user23123412

ответ

5

У вас есть три варианта:

1) Если вы не возлагали Critera апи, я рекомендую использовать 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) Если вы хотите использовать критерии 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(); 
+0

извините за поздний ответ @netik –

+0

Я пытаюсь использовать первый вариант, но я получаю 'MySQLSyntaxErrorException', причина не распознает' trunc' ... –

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!

 Смежные вопросы

  • Нет связанных вопросов^_^