簡體   English   中英

使用JPA / HQL從多對多關系中檢索列表

[英]Retrieveing list from a many-to-many relation with JPA/HQL

我有3個課程,我試圖獲取用戶已預訂的eventhost的所有事件的列表。 我可能認為方法過於復雜,但是我對JPA / HQL的經驗很少。

用戶類別

@ManyToMany
    @JoinTable(name = "Subscriptions", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id") , inverseJoinColumns = @JoinColumn(name = "event_host_id", referencedColumnName = "id") )
    private List<EventHost> subscriptions;

EventHost類

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "event_host_id", referencedColumnName = "id", updatable = true)
private List<Event> events;

我嘗試使用此查詢,但它告訴我訂閱未映射,因為它不是Java類,所以沒有映射。

String hql = "SELECT o FROM Event WHERE event_host_id IN (SELECT a FROM EventHost WHERE id IN(SELECT b FROM User WHERE = + " + userid + "))";

我知道像這樣注入用戶ID是不好的做法,我只是出於測試目的而這樣做。

請問您是否還需要其他內容,我真的很想了解如何為此編寫查詢。

這個問題實際上應該是HQL with two join tables ,但我讓您對其進行更改。 由於其HQL或JPA,它是獨立於數據庫的。

無論如何,任何時候看到OneToManyManyToMany關系時,您都有一個聯接join table ,因此您應該考慮聯接。 查看sql create table語句以查看發生了什么總是一個好主意。 在這種情況下,您的user_subscriptions表為:

create table user_subscriptions (user_id integer not null, subscriptions_id integer not null)

您的event_host_events連接表是這樣的:

create table event_host_events (event_host_id integer not null, events_id integer not null)

那里沒有新東西。 當您嘗試獲得直覺無法理解的新功能時,請將其分解為可以做的事情。 例如,您可以執行兩個查詢,首先獲取Users訂閱,然后獲取這些訂閱的Events

Query query = session.createQuery("select u.subscriptions from User u where name = :name");  
query.setParameter("name", name);
List<EventHost> subscriptions = query.list();
List<Event> events = new ArrayList<Event>();
Query query2 = session.createQuery("select s.events from EventHost s where id = :id");  
for (EventHost s: subscriptions ) {
    query2.setParameter("id", s.getId());
    events.addAll( query2.list());
}

不優雅,但是可以。 然后,保持join記住,搞清楚如何使一個語句出來他們倆的。

Query query = session.createQuery("select s.events from User u join u.subscriptions s where u.name = :name)");  
query.setParameter("name", name);
return query.list();

默認情況下,該聯接將使用inner join ,因此您可以。 JPA提供程序將為您自動魔術地連接您的三個Entity表和兩個Join Tables

select 
    event4_.id as id1_2_
from user user0_ 
    inner join user_subscriptions subscripti1_ on user0_.id=subscripti1_.user_id 
    inner join event_host eventhost2_ on subscripti1_.subscriptions_id=eventhost2_.id 
    inner join event_host_events events3_ on eventhost2_.id=events3_.event_host_id 
    inner join event event4_ on events3_.events_id=event4_.id 
where user0_.name=?

您不是很高興不必編寫該查詢嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM