2014-03-06 129 views
0

我有一個應用程序,允許用戶選擇某些關鍵字,然後應用程序監聽包含這些關鍵字的推文並將它們存儲在數據庫中。Ebean + ManyToMany加入

對於給定的用戶,他們有一個關鍵字列表。我想要做的是通過計算在給定的每天/每月發生的與該關鍵字相關的推文數量,獲取關於每個關鍵字在給定的日期,月份等中的效果的統計數據。

public class Person extends Model { 
    @id 
    long id; 

    @ManyToMany 
    List<Keywords> keywords = new ArrayList(); 

} 
public class Keyword extends Model { 

@Id 
int id; 
String keyword; 

@ManyToMany 
public List<Tweet> tweets = new ArrayList(); 
} 

public class Tweet extends Model { 

@Id 
int id; 
    TimeStamp datetime; 
} 

我認爲這樣做會Tweet.find --where關鍵字=千瓦和日期> D--最好的方式,但我不知道如何做到這一點。我應該使用抓取嗎?以下是普通SQL中的一個類似查詢。

select datetime, count(*) from tweet t left outer join keyword_tweet on t.id=keyword_tweet.tweet_id group by cast(t.datetime as date) having t.datetime > '2014-02-02'; 

+---------------------+----------+ 
| datetime   | count(*) | 
+---------------------+----------+ 
| 2014-02-02 13:27:45 |  1 | 
| 2014-02-08 05:14:04 |  2 | 
| 2014-02-09 08:34:31 |  1 | 
| 2014-02-12 12:42:02 |  1 | 
| 2014-02-13 06:00:09 |  2 | 
| 2014-02-14 00:47:04 |  2 | 
| 2014-02-15 07:26:30 |  6 | 
| 2014-02-16 01:00:00 |  21 | 
| 2014-02-17 00:06:50 |  916 | 
| 2014-02-18 18:08:56 |  1 | 
| 2014-02-19 01:28:40 |  1 | 
| 2014-02-24 16:45:11 |  1 | 
| 2014-02-26 14:43:54 |  4 | 
| 2014-02-27 08:24:09 |  9 | 
| 2014-02-28 05:08:16 |  411 | 
+---------------------+----------+ 

所以,從那裏鳴叫(鳴叫id爲用戶關鍵字列表)

選擇我也喜歡到GROUP BY:

cast(t.datetime as date) 

,並具有

date > 2014-02-02 //example date 

關於某些查詢。感謝任何幫助傢伙!

回答

1

這可能不是你正在尋找的東西,但也許它會讓你開始。有方法可以在下面的Tweet.find.where()中使用查詢,而不是使用Person中的關鍵字列表,這可能更容易。有一些加入git hub examples,但他們有點舊

package models.test; 

import play.db.ebean.Model; 

import javax.persistence.*; 
import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by aakture on 3/7/14. 
*/ 
@Entity 
public class Person extends Model { 
    @Id 
    long id; 

    @OneToMany(cascade = CascadeType.ALL) 
    List<Keyword> keywords = new ArrayList(); 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public List<Keyword> getKeywords() { 
     return keywords; 
    } 

    public void setKeywords(List<Keyword> keywords) { 
     this.keywords = keywords; 
    } 

    public static Finder<Integer, Person> find = new Finder<Integer, Person>(
      Integer.class, Person.class); 
} 

package models.test; 

import play.db.ebean.Model; 

import javax.persistence.Entity; 
import javax.persistence.Id; 

@Entity 
public class Keyword extends Model { 

    @Id 
    Integer id; 

    String text; 


    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 
    public static Finder<Integer, Keyword> find = new Finder<Integer, Keyword>(
      Integer.class, Keyword.class); 

} 

package models.test; 

import play.db.ebean.Model; 

import javax.persistence.*; 
import java.sql.Date; 
@Entity 
public class Tweet extends Model { 

    @Id 
    Integer id; 

    Date datetime; 

    @OneToOne 
    Keyword keyword; 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public Keyword getKeyword() { 
     return keyword; 
    } 

    public void setKeyword(Keyword keyword) { 
     this.keyword = keyword; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public Date getDatetime() { 
     return datetime; 
    } 

    public void setDatetime(Date datetime) { 
     this.datetime = datetime; 
    } 

    public static Finder<Integer, Tweet> find = new Finder<Integer, Tweet>(
      Integer.class, Tweet.class); 

} 

    @Test 
    public void testTweets() { 
     List<Keyword> keywordList = new ArrayList<Keyword>(); 
     Keyword keyword = new Keyword(); 
     keyword.setText("hello"); 
     keywordList.add(keyword); 

     keyword = new Keyword(); 
     keyword.setText("world"); 
     keywordList.add(keyword); 
     Person person = new Person(); 
     person.setKeywords(keywordList); 
     person.save(); 

     keyword = Keyword.find.where().eq("text", "hello").findUnique(); 
     log.info("keywords " + keyword); 
     java.sql.Date now = new java.sql.Date(new Date().getTime()); 
     for(int i = 0; i < 10; i++) { 
      Tweet tweet = new Tweet(); 
      tweet.setKeyword(keyword); 
      tweet.setDatetime(now); 
      tweet.save(); 
     } 
     log.info("now is  " + now.getTime()); 
     Calendar cal = Calendar.getInstance(); 
     cal.add(Calendar.DAY_OF_YEAR, -7); 
     java.sql.Date oneHourAgo = new java.sql.Date(cal.getTimeInMillis()); 
     log.info("oneHourAgo is " + oneHourAgo.getTime()); 
     List<Keyword> personsKeywords = person.getKeywords(); 
     List<String> keyWordsStringList = new ArrayList<String>(); 
     for(Keyword kw : keywordList) { 
      keyWordsStringList.add(kw.getText()); 
     } 
     List<Tweet> tweets = Tweet.find.where().and(Expr.in("keyword.text", keyWordsStringList), Expr.gt("datetime", oneHourAgo)).findList(); 
     log.info("tweets has " + tweets.size()); 
    } 
+0

是的,是的,是的!這正是我期待的,很多很好的例子。謝謝您,先生,我一直對此感到沮喪太久。 –

+0

很高興幫助。我花了最近兩週的時間試圖讓一些多對多的連接工作,許多令人沮喪的夜晚,但我發現這主要是由於我不瞭解ebean的工作原理以及缺少示例和文檔。它與JPA規範非常接近,但不完全相同,所以這些也不完全有幫助。 –