我有一个应用程序,允许用户选择某些关键字,然后该应用程序监听包含这些关键字的推文并将它们存储在数据库中。
对于给定用户,他们有一个关键字列表。我想做的是通过计算在给定的日期/月份发生了多少 strip 有该关键字的推文来获取有关每个关键字在给定的日期、月份等的表现的统计信息。
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 keywords=kw and date > d-- 但我不知道该怎么做。我应该使用 fetch 吗?下面是一个用普通 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 在用户关键字列表中)
我还想分组依据:
cast(t.datetime as date)
并且拥有
date > 2014-02-02 //example date
针对某些查询。感谢大家的帮助!!
最佳答案
这可能不完全是您正在寻找的内容,但也许它可以帮助您入门。有多种方法可以进行连接,或者在下面的 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());
}
关于java - Ebean + ManyToMany 加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22237785/