2016-11-06 245 views
0

我是HQL初學者(並且在所有休眠狀態下)。我需要一個簡單的多對多關係幫助:HQL查詢返回沒有結果

視頻 - video_category - 類別

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; 

而這個查詢沒有給我結果

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

如果我只發送.createQuery("from Video") - 它給了我所有視頻(所以DB連接是罰款)。 Category a video_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的視頻是非常奇怪的。你想達到什麼目的?什麼是'類別'?你爲什麼不使用session.get(Video.class,id)? –

+0

對不起,我會編輯它。這是一個ManyToMany關係,我試圖加入table'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'是類別的別名。一切都會更清晰,命名方式很好:'從視頻視頻內連接video.categories類別中選擇視頻,其中category.id =:catagoryId'。 –

回答

1

您正在使用視頻的別名,而不是使用類別的別名。使用連擊名字,它應該變得更加明顯:

select video 
from Video video 
inner join video.categories category 
where category.id = :categoryId