2010-12-30 10 views
1

これを置く方法がわかりません。しかし、ここに行く。エンティティがデータベースに存在しなくても、エンティティを返すためのhibernateの取得方法

私はテーブルムービーとuser_movieを持つデータベースを持っており、ムービーは任意のムービーに関する情報を保持しており、user_movieはムービーとのユーザー関係に関する情報を保持しています。

したがって、ユーザーが特定のムービーに「監視」という値を設定すると、user_movieにテーブルレコードが記録されます。ただし、ユーザーが監視対象の映画を設定しない場合は、ムービーが視聴されておらず、レコードが設定されていないことを意味します。このロジックは既に存在しています。 (今はいつも、映画の数を各ユーザごとにデフォルトのレコードを作成することができましたが、これはあまり効果的ではありません。)

私は映画のようにクエリを作成しようとすると、ユーザーが視聴していないことを示します。それは私のデータベースのすべての映画のリストを返す必要があります。ただし、user_mediaにはレコードが含まれていないため、実際には空のリストが表示されます。

ここで使用できる解決策はありますか?

エンティティが存在しない場合に、「デフォルト」エンティティを返すために休止状態にすることは可能ですか?または "左結合"の場合に、結合された値がNULLの場合、デフォルト値を返すことができますか?

現在のバックエンドはmysqlです。多分私はこの問題に対処するカスタム関数を作成することができますか?

EDIT

も(真、偽)、感情(LOVE、ヘイト、NULL)wishlisted、取​​得(真、偽)のような値を保持することができますuser_mediaは

私の解決策のための要件は、私が得るということですムービーで結合されたuser_mediaのリスト。したがって、user_mediaはNULLにすることはできません。 MySQL

+0

ユーザーが視聴していたすべての映画のリストを、どのように取得しましたか?両方の状況に対応できる単一のクエリが必要です。 –

+0

これはおそらく? idが入っているムービー(監視されているuserMediaのmovie_idをfalseとuser_id = x)から見ると、watchedはuser - > movie関係の値の1つに過ぎず、acquire(true、false)、emotion (LOVE、HATE、NULL)、wishlisted(true、false) – netbrain

答えて

4

このクエリは戻ります映画ユーザー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)を作成します。

テストケース:これは、ユーザーが挿入されませんでしたので、Surf Nazis Must Dieが返され、ユーザーが明示的に彼はそれを見ていない語ったので

1, 'Titanic' 
3, 'Surf Nazis Must Die' 

Titanicが返される戻ります

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 
     ); 

それのための記録。

+0

これは実際にはユーザーに関係のない映画のリストを私に与えるだけです。私は実際には、ユーザーがムービーに対して何もアクションを実行していないことを意味します。したがって、user_mediaにそのユーザーの記録はありません。この例では、ユーザが実際に「監視」を偽に設定したムービーは含まれません。 – netbrain

+0

「AND監視= 1」が異なると思われます。 – codelark

+0

この解決法は私のためには機能しません、afaics。 – netbrain

関連する問題