【问题标题】:Ebean + ManyToMany joinsEbean + 多对多连接
【发布时间】:2014-03-06 22:43:35
【问题描述】:

我有一个允许用户选择某些关键字的应用程序,然后该应用程序会侦听包含这些关键字的推文并将它们存储在数据库中。

对于给定的用户,他们有一个关键字列表。我正在尝试做的是通过计算在给定的日期/月份发生了多少条带有该关键字的推文,来获取有关每个关键字在给定的日期、月份等的表现的一些统计数据。

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 keyword=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

在某些查询上。感谢大家的帮助!!

【问题讨论】:

    标签: java mysql playframework-2.0 ebean


    【解决方案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());
        }
    

    【讨论】:

    • 是的,是的,是的!这正是我一直在寻找的,有很多很好的例子。谢谢您,先生,我对此感到沮丧太久了。
    • 很高兴为您提供帮助。在过去的两周里,我试图让一些多对多的连接工作,许多令人沮丧的夜晚,但我发现这主要是由于我不了解 ebean 的工作原理,以及缺乏示例和文档。它与 JPA 规范相当接近,但并不完全如此,所以这些也没有什么帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多