2015-06-08 148 views
2

我想選擇由一個自定義的層次結構並列的所有實體:如何用sql創建嵌套選擇?

@Entity 
class Employee { 
    @Id 
    private long id; 

    @ManyToOne 
    private Company company; 
} 

@Entity 
class Company { 
    @Id 
    private long id; 

    @ManyToOne 
    private LeisureGroup leisureGroup; 
} 

@Entity 
class LeisureGroup { 
    @Id 
    private long id; 
} 

//選擇屬於LeisureGroup

Select * from company where leisureGroupId = '123' 

TODO所有的公司:我怎樣才能選擇屬於所有員工到LeisureGroup(由公司參考)?我必須在這裏使用joins嗎?如果是,如何?

+0

如果你不使用SQL要通過JPA查詢,您使用JPQL(Java持久性查詢語言)或HQL(Hibernate查詢語言) – Tobb

回答

1

如果您想通過JPA查詢,您使用JPQL(Java持久性查詢語言)或HQL(Hibernate查詢語言)(用於Hibernate用戶),則不使用SQL。

JPQL查詢(需要EntityManager變量稱爲em

public List<Employee> findEmployeesInLeisureGroup(final Integer leisureGroupId) { 
    final TypedQuery<Employee> query = 
     em.createQuery("select e " + 
         "from Employee e join e.company c join c.leisureGroup l " + 
         "where l.id = :leisureGroupId", Employee.class); 
    query.setParameter("leisureGroupId", leisureGroupId); 
    return query.getResultList(); 
} 

SQL相當於:

select * from Employee 
where company_id in (select id from Company where leisureGroup_id = 123); 
+0

這沒有奏效(「where語法錯誤」)。 – membersound

+0

我在這裏直接在StackOverflow中編程,不能保證它實際上能夠工作:p我無法真正理解爲什麼它不起作用,但至少你有一個加入JPQL的例子。另外,不要指望將它作爲SQL運行,這是一個JPA查詢。 – Tobb

+0

只有當subselect返回一行/一個結果時,你的sql纔會有效。但大多會有多個公司分配到同一個休閒組... – membersound

2

嘗試這樣的事:

Select e from Employee e where e.company.id= (select c.id from Company c where c. leisureGroup.id=:id 
+0

我想選擇所有員工,而不是公司! – membersound

+0

檢查更新後的代碼 –

+0

如果只有一個'company'分配給'leisuregroup',這將起作用。但對於指定的2+公司,將返回「結果有多行」。但是由於@ ManyToOne的原因,這種情況大多會發生。 – membersound