即使数据库中不存在实体,如何让hibernate返回实体

时间:2010-12-30 23:35:59

标签: mysql database hibernate null entity

好的,我不知道怎么放这个。但是这里有。

假设我有一个包含表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。

1 个答案:

答案 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