【问题标题】:How to get hibernate to return entity even if entity doesn't exist in database即使数据库中不存在实体,如何让休眠返回实体
【发布时间】:2010-12-30 23:35:59
【问题描述】:

好的,我不知道该怎么说。但是这里有。

假设我有一个包含电影和 user_movie 表的数据库,movie 保存有关任何给定电影的信息,user_movie 保存有关用户与电影的关系的信息。

因此,当用户在给定电影上设置“已观看”值时,这会导致 user_movie 中的表记录。但是,如果用户没有将任何电影设置为已观看,那么这将意味着没有电影被观看并且没有记录被设置。所以这个逻辑已经到位。 (现在我总是可以为每个用户创建一个默认记录乘以电影数量。但这不会很有效。)

因此,当我尝试创建类似查询时,请获取用户未观看的所有电影。那应该返回我数据库中所有电影的列表。但是,由于 user_media 不包含任何记录,它实际上会给我一个空列表。

那么有什么我可以在这里使用的解决方案吗?

如果实体不存在,是否可以让休眠返回“默认”实体?或者如果是“左连接”并且连接值为 NULL,我可以返回默认值吗?

我当前的后端是 mysql。也许我可以创建一个自定义函数来处理这个问题?

编辑

user_media 还可以保存获取 (true,false)、愿望清单 (true,false)、情感 (LOVE,HATE,NULL) 等值

我的解决方案的一个要求是我得到一个 user_media 列表加入电影。因此 user_media 不能为 NULL。

【问题讨论】:

  • 在用户看过一些电影的情况下,如何获取用户未看过的所有电影的列表?应该有一个查询可以处理这两种情况。
  • 可能是这样的? from Movie where id in (select movie_id from UserMedia where waiting = false and user_id = x), seen 只是 user -> movie 关系中的值之一,还有其他值,如,acquired (true,false),emotion (爱,恨,空),愿望清单(真,假)

标签: mysql database hibernate null entity


【解决方案1】:

MySQL 中的此查询将返回用户1 尚未观看的电影列表:

SELECT  *
FROM    movie
WHERE   id NOT IN
        (
        SELECT  movie_id
        FROM    user_movie
        WHERE   user_id = 1
                AND watched = 1
        )

user_movie (user_id, movie_id) 上创建一个UNIQUE 索引(或者,更好的是PRIMARY KEY),以便快速工作。

一个测试用例:

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 被返回是因为用户没有为其插入记录。

【讨论】:

  • 这实际上只会给我与用户没有关系的电影列表。没有关系我实际上是指用户没有对电影执行任何操作,因此在 user_media 中没有它的记录。此示例不包括用户实际将“已观看”设置为 false 的电影
  • “AND seen = 1”会有所不同。
  • @netbrain:这将返回用户尚未设置watched = 1 的所有电影,方法是插入具有watched 的其他值的记录(如0),或者不插入记录下来。这不是你想要的吗?
  • @Quassnoi,是的,这就是我问的问题,但这是一个简化的问题,在这种情况下确实有效,但并非在我的所有情况下都有效。
  • @Don Roby 好吧,以这个案例为例。假设我们也扩展了 user_movie,而不仅仅是观看。所以我们现在已经观察并获取了这两个字段。现在我想获取 user1 已获得的所有电影,并且 user1 和 user2 尚未设置为已观看。
猜你喜欢
  • 1970-01-01
  • 2015-03-10
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
相关资源
最近更新 更多