Как получить Hibernate, чтобы вернуть сущность, даже если сущность не существует в базе данных - PullRequest
1 голос
/ 31 декабря 2010

Хорошо, я не уверен, как это поставить. Но здесь идет.

скажем, у меня есть база данных с таблицами movie и user_movie, movie содержит информацию о любом конкретном фильме, а user_movie содержит информацию об отношениях пользователей с фильмом.

Таким образом, когда пользователь устанавливает значение «просмотрено» для данного фильма, это приводит к записи таблицы в user_movie. однако, если пользователь не устанавливает фильмы как просмотренные, это будет означать, что фильмы не были просмотрены и записи не установлены. так что эта логика уже на месте. (Теперь я всегда мог создать запись по умолчанию для каждого пользователя, умноженную на количество фильмов. Но это не очень эффективно.)

поэтому, когда я пытаюсь создать такой запрос, принесите мне все фильмы, которые пользователь не смотрел. это должно вернуть мне список ВСЕХ фильмов в базе данных. однако, так как user_media не содержит никаких записей, это фактически дало бы мне пустой список.

так есть ли решение, которое я мог бы использовать здесь?

Можно ли заставить hibernate возвращать сущность «по умолчанию» в случае, если сущность не существует? или в случае «левого соединения» и присоединенное значение равно NULL, я могу вернуть значение по умолчанию?

мой текущий бэкэнд - mysql. Может быть, я мог бы создать пользовательскую функцию для решения этой проблемы?

EDIT

user_media также может содержать значения, такие как приобретенные (true, false), список пожеланий (true, false), эмоции (LOVE, HATE, NULL)

Для моего решения требуется, чтобы я получил список user_media, объединенных с фильмом. Поэтому user_media не может быть NULL.

1 Ответ

4 голосов
/ 31 декабря 2010

Этот запрос в 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 возвращается, потому что пользователь не вставил запись для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...