2014-11-21 78 views
1

在Play項目中,我有兩種實體AB,以及兩個關係XYX擁有A實體和country字段的夫婦,而Y擁有混合A-B對夫婦。實體B也保存country字段。我需要對A進行查詢,該查詢告訴我A是與X.country='US'YY.B.country='US'的關係中的關係中的第二個實體。此查詢的工作PostgreSQL的說法是:Ebean中的UNION運算符(或有效替代方法)

SELECT * FROM A WHERE A.id IN 
    (
    (SELECT X.a2_id FROM X WHERE country = 'US') 
    UNION 
    (SELECT Y.a_id FROM Y WHERE b_id IN 
    (SELECT B.id FROM B WHERE B.country = 'US') 
    ) 
); 

隨着Ebean我設法讓每個工作的子查詢的,只是我錯過了union聲明:

Query subqueryX = X.find.select("a2.id") 
     .where().eq("country","US").query(); 

Query subqueryY = Y.find.select("a.id") 
     .where().eq("b.country", "US").query(); 

List<A> result = A.find.where().in("id", subquery).findList(); 

這裏,findplay.db.ebean.Model.Finder<Id.class, Entity.class>,像Play的計算機數據庫模板。我想將這兩個子查詢合併到一個唯一的子查詢中,以將它放入result行的subquery參數中。

我已經試圖從subqueryXsubqueryY兩個,然後使用ExpressionList<T>.in(String propertyName, Collection<?> values)收集id S,但後來我得到了java.sql.SQLException: Connection is closed!如果Collection變得太大(它通常是這樣)。

有什麼建議嗎?

編輯

等待,也

List<A> result = A.find.where().in("id", subquery).findList(); 

失敗,給我一個java.sql.SQLException: Connection is closed!。所以這個問題開啓了我如何在ebean中實現上面的SQL查詢?

P.S.連接關閉時,在.in()方法集合中約有32750個IDS ...

+0

我設法讓它直接執行'RawSql',但生成的查詢返回完全錯誤的'findRowCount()'...這是一個錯誤還是我錯過了一些東西? – davide 2014-11-21 13:19:24

回答

2

我在這裏看到的兩個解決方案:

  1. 使用RawSql執行SQL查詢。
  2. 你有一套ID,你想要一個對象列表,但調用.in()會在收集過大時拋出異常。因此,您可以將一組ID分割爲較小的集合,併爲每個集合調用.in()。然後將結果列表連接到一個列表中。