2016-11-06 6 views
0

私はHQLで初心者です(そして、休止状態です)。 - video_category - カテゴリHQLクエリは結果を返しません。

Category.java

@Entity 
public class Category { 

    @Id 
    @GeneratedValue 
    private int id; 

    @Size(min = 3, max = 20, message = "3-20 chars!") 
    private String name; 

    @ManyToMany(mappedBy = "categories") 
    private List<Video> videos; 

    //Getters and setters 

Video.java

@Entity 
public class Video { 

    @Id 
    @GeneratedValue 
    private int id; 

    private String url; 

    private Date publishDate; 

    @ManyToOne(cascade = CascadeType.REMOVE) 
    @JoinColumn(name = "user_id") 
    private User user; 

    @NotEmpty 
    @ManyToMany(cascade = CascadeType.REMOVE) 
    @JoinTable(name = "video_category", joinColumns = @JoinColumn(name = "video_id"), inverseJoinColumns = @JoinColumn(name = "category_id")) 
    private List<Category> categories; 

ビデオ:私はシンプル多対多関係で助けが必要それは私にすべてのビデオを提供します(そうDBへの接続で結構です) -そして、このクエリは、私はちょうど.createQuery("from Video")を送信する場合、私には結果

Query query = sessionFactory 
      .getCurrentSession() 
      .createQuery(
        "from Video vid inner join vid.categories cat where vid.id = :category"); 
query.setParameter("category", category); 

を与えません。 Categoryvideo_categoryテーブルにもデータがあります。私は、テーブルやどこかに参加する間違いがあると思う。

編集:

私はテーブルvideo_categoryに行くとcategory_idのためにそこに見て達成しようとしています。 SQLでは次のようになります。select * from Video join video_category on Video.id=video_category.video_id where category_id = 2

+0

'ug'(地獄は、それが代わりにvideo''で、このように命名されている理由)ビデオの別名です。そしてあなたはIDがパラメータ 'category'と等しいビデオを見つけようとしています。どちらも、このパラメータの名前が 'videoId'であるか、実際にはカテゴリのIDであるという非常に奇妙な名前を選んだのか、カテゴリのIDを持つビデオを見つけることは非常に奇妙です。あなたは何を達成しようとしていますか? 'category'とは何ですか?なぜあなたは単にsession.get(Video.class、id)を使用しないのですか? –

+0

申し訳ありません、私はそれを編集します。それはManyToMany関係であり、私は 'video_category'テーブルに加わり、' category_id'を探しています。 SQLでは、次のようなものです。 'select * from Video join video_category on Video.id = video_category.video_id where category_id = 2'。 – Pivoman

+0

それから、 'where u.id =:category'が必要です。 'ug'はビデオのエイリアスです。 'u'はcategoryのエイリアスです。良い名前を付けると、すべてがはっきりと分かります: 'ビデオビデオからビデオを選択するinner join video.categories category where category.id =:catagoryId'。 –

答えて

1

カテゴリのエイリアスを使用する代わりに、ビデオのエイリアスを使用しています。使用打者名、そして、それははるかに明白になる必要があります。

select video 
from Video video 
inner join video.categories category 
where category.id = :categoryId 
関連する問題