好的,我不知道怎么放这个。但是这里有。
假设我有一个包含表movie和user_movie的数据库,movie保存有关任何给定电影的信息,user_movie保存有关用户与电影关系的信息。
因此,当用户在给定的电影上设置“观看”值时,这会在user_movie中生成一个表记录。但是,如果用户没有将任何电影设置为观看,则这意味着没有观看过没有电影而且没有设置任何记录。所以这个逻辑已经存在。 (现在我总是可以为每个用户创建一个默认记录,而不是电影的数量。但这不会非常有效。)
因此当我尝试创建一个类似的查询时,会获取用户尚未观看过的所有电影。这应该返回一个数据库中所有电影的列表。但是,由于user_media不包含任何记录,它实际上会给我一个空列表。
那么我可以在这里找到解决方案吗?
在实体不存在的情况下,是否有可能让hibernate返回“默认”实体?或者如果是“左连接”并且连接值为NULL,我可以返回默认值吗?
我当前的后端是mysql。也许我可以创建一个自定义函数来处理这个问题?
修改
user_media还可以包含已获取(true,false),wishlisted(true,false),情感(LOVE,HATE,NULL)等值
我的解决方案的一个要求是我获得了一个与电影结合的user_media列表。因此user_media不能为NULL。
答案 0 :(得分:4)
MySQL
中的此查询会返回用户1
尚未观看过的电影列表:
SELECT *
FROM movie
WHERE id NOT IN
(
SELECT movie_id
FROM user_movie
WHERE user_id = 1
AND watched = 1
)
在UNIQUE
上创建PRIMARY KEY
索引(或者更好,user_movie (user_id, movie_id)
),以便快速开展工作。
测试用例:
CREATE TABLE movie (id INT NOT NULL PRIMARY KEY, name TEXT);
CREATE TABLE user_movie (user_id INT NOT NULL, movie_id INT NOT NULL, watched BOOL, PRIMARY KEY (user_id, movie_id));
INSERT
INTO movie
VALUES
(1, 'Titanic'),
(2, 'Office Space'),
(3, 'Surf Nazis Must Die');
INSERT
INTO user_movie
VALUES (1, 1, FALSE),
(1, 2, TRUE);
SELECT *
FROM movie
WHERE id NOT IN
(
SELECT movie_id
FROM user_movie
WHERE user_id = 1
AND watched = 1
);
这将返回
1, 'Titanic'
3, 'Surf Nazis Must Die'
返回 Titanic
是因为用户明确告诉他没有看到它,因为用户没有为其插入记录而返回Surf Nazis Must Die
。