2008-11-26 23 views
6

Zaman damgası alan tipi datetime olan bir tablom var. Tanımlanmış bir başlangıç ​​ve bitiş zamanı arasındaki verileri, x'in fonksiyon parametresi olarak verildiği, eşit uzunluktaki zaman aralıklarını temsil eden x gruplarına toplamalıyım.Hazırda bekletme grubuna göre zaman aralığı

Hazırda bekletme ile bunu yapmanın en iyi yolu ne olurdu?

DÜZENLEME: Bazı açıklamalar

MySQL Tablo:

data_ts: datetime pk 
value1 : int 
value2 : bigint 
... 

Varlık sınıfı: Ben yapan bir HQL sorgu için arıyorum

Calendar dataTs; 
Integer value1; 
BigDecimal value2; 
... 

select max(c.value1), avg(c.value2) from MyClass c 
    where c.dataTs between :start and :end group by <interval> 

gibi bir şey nerede kim le zaman periyodu x eşit büyüklükte zaman aralıklarına ayrılmıştır.

Örnek:

Start : 2008-10-01 00:00:00 
End : 2008-10-03 00:00:00 (2 days) 
Groups: 32 

(48 saat/32), 1.5 saatlik bir zaman aralığı ile toplanabilir gerekir:

2008-10-01 00:00:00 - 2008-10-01 01:29:59 
2008-10-01 01:30:00 - 2008-10-01 02:59:59 
2008-10-01 02:00:00 - 2008-10-01 04:29:59 
... 

cevap

9

Aynı sorunu çözmeye çalıştım. Verileri bir gün içinde 2 saatlik aralıklarla gruplamak zorundayım. Aslında, "saf" Hibernate bu şekilde kullanılmamalıdır. Bu yüzden, yerel SQL projeksiyonunu Hibernate kriterlerine ekledim. sizin örnekte bir (Ben MySQL sözdizimi & işlevleri kullanıyorum) aşağıdaki gibi görünebilir:

int hours = 2; // 2-hours interval 

Criteria criteria = session.createCriteria(MyClass.class) 
      .add(Restrictions.ge("dataTs", start)) 
      .add(Restrictions.le("dataTs", end)); 


ProjectionList projList = Projections.projectionList(); 
     projList.add(Projections.max("value1")); 
     projList.add(Projections.avg("value2")); 
     projList.add(Projections.sqlGroupProjection(
      String.format("DATE_ADD(DATE(%s_.dataTs), INTERVAL(HOUR(%s_.dataTs) - HOUR(%s_.dataTs) %% %d) HOUR) as hourly", criteria.getAlias(), criteria.getAlias(), criteria.getAlias(), hours), 
      String.format("DATE_ADD(DATE(%s_.dataTs), INTERVAL(HOUR(%s_.dataTs) - HOUR(%s_.dataTs) %% %d) HOUR)", criteria.getAlias(), criteria.getAlias(), criteria.getAlias(), hours), 
      new String[]{ "hourly" }, 
      new Type[]{ Hibernate.TIMESTAMP }) 
     ); 
     criteria.setProjection(projList); 

List results = criteria 
      .setCacheable(false) 
      .list(); 

kod biraz çirkin bakıyor ama sorunu çözer. Umarım genel fikir sizin için faydalı olacaktır.

3

hazırda nesnelerin bir grafik arasındaki aramalar için (varlıklar ve değer-türleri) ve ilişkisel bir veritabanındaki temsilleri.

Soru açıklamanızdan, model oluşturduğunuz herhangi bir varlıktan bahsetmiyorsunuz, dolayısıyla yerel bir SQL sorgusuna geçmenizi öneririz. Eğer tablo yapısını yayınlanmıştır eğer

http://www.hibernate.org/hib_docs/reference/en/html/querysql.html

Belki, bu soru için daha fazla bağlam verebilir?

İlgili konular