我有一个推文表(@OneToMany)和另一个analyzetweets表(@ManyToOne)和' n' tweet表中每个条目的analyzetweets数量(每个分析师一个)。从本质上讲,我可以拥有任意数量的分析师(在表格中表示),每个人只能分析一次推文。为了使它更复杂一些,推文表中的条目按进程分组,由另一个表表示。
我的问题是,如果给定一个特定的process_id和analyst_id,我将如何在最后一个条目中查询analyzetweet表中的tweet_id,然后使用它来查找tweet表中的下一条推文,同时给出相同的process_id和analyst_id?基本上,我想向分析师提供他/她尚未在该特定流程(运行)中分析的下一条推文。
以下是我的表格:
CREATE TABLE tweet (
id SERIAL PRIMARY KEY,
process_id INTEGER NOT NULL REFERENCES process(id) ON DELETE CASCADE ON UPDATE CASCADE,
...
);
CREATE TABLE analyzedtweet (
id SERIAL PRIMARY KEY,
tweet_id INTEGER NOT NULL REFERENCES tweet(id) ON DELETE CASCADE ON UPDATE CASCADE,
analyst_id INTEGER NOT NULL REFERENCES analyst(id) ON DELETE CASCADE ON UPDATE CASCADE,
process_id INTEGER NOT NULL REFERENCES process(id) ON DELETE CASCADE ON UPDATE CASCADE,
...
);
CREATE TABLE process (
id SERIAL PRIMARY KEY,
...
);
CREATE TABLE analyst (
id SERIAL PRIMARY KEY,
...
);
我知道如何执行此操作的唯一方法分为两步:
SELECT tweet_id from analyzedtweet WHERE analyzedtweet.analyst_id = analystId AND analyzedtweet.process_id = processId ORDER BY analyzedtweet.tweet_id DESC LIMIT 1
SELECT * from tweet WHERE tweet.id > latestTweetId AND tweet.process_id = processId ORDER BY tweet.id DESC LIMIT 1
我确信有更好的方法可以通过JOIN做到这一点,我无法弄清楚如何。
最后,我正在使用Hibernate并希望恢复POJO。
答案 0 :(得分:0)
如果您要获取给定process_id的最新推文,并且analyzetweet_id使用此查询:
List<Tweet> t = session.createQuery("select t from tweet t
join t.process p,t.analyzedtweet a
where p.id=? and a.id=? order by t.id desc")
.setParameter(1, process_id)
.setParameter(2, analyzedtweet_id)
.setMaxResults(1).getResultList();