2014-04-21 38 views
0

我有兩個實體:「訂單」和「WorkPosition」。工作位置通過訂單ID相關,這意味着我在這裏有一個toMany-Relationship。一個訂單具有「n」個工作位置,而一個工作位置始終具有一個order_id。所以有一個函數:order.getWorkPositions()。greenDao模擬加入

我現在正在做什麼: Rightnow我查詢所有訂單,然後我遍歷訂單。如果訂單具有workposition.type =「1」的工作位置。

問題是這很慢,因爲我至少有1000個訂單和更多的工作位置。

問題: 我看到「加入」功能無法正常工作,但對greenDao首頁我看到下面的查詢:

Query query = userDao.queryBuilder().where(
new StringCondition("_ID IN " + 
"(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)").build(); 

我該如何使用它來加速比我的查詢?我可以將訂單作爲查詢中的返回類型嗎?或者我可以只有一個ID列表?

作爲查詢我想是這樣的:

Query<Orders> query = getDAOSession().getOrdersDao().queryBuilder() 
.where(new StringCondition("?_ID IN? "+ 
"(SELECT * FROM Orders AS O JOIN WorkPosition AS W WHERE w.type=1)")).build(); 
List<Orders> orders = query.list(); 

我希望你能理解我的問題,如果不告訴我,我將盡力改善它:)

回答

0

的「加盟」功能只有greendao-api不支持。這意味着你不能使用Property的平等命名函數來建立連接。

但是,只要SQLite支持,您可以構建所需的每個WhereCondition。這意味着如果您正確連接,您的查詢將會起作用。 (我注意到你沒有指定「ON」語句)。

+0

謝謝。實際上它的工作沒有「開」 - 陳述。我的問題是,我試圖添加兩個日期之間的查詢。我發現greenDao不需要日期本身。它希望date.getTime() – oli

+0

@oli不過,我建議使用「on」語句和「userdao.Properties」中定義的列名一起使用。通過這種方式,您可以控制連接,並且更改模式不太可能破壞連接。最重要的是,如果您的模式更改,並且您在語句中依賴的某些列將產生編譯時錯誤,而不是運行時錯誤。 – AlexS

1

根據我的經驗,我通常使用原始查詢加入語句。只有Ormlite支持部分加入,但它非常簡單,並不適用於所有情況。我的提議 - 使用原始查詢和遊標

+0

實際上,對於我來說,如果您只需要一個實體的信息,但您想要使用連接進行過濾,則此代碼行可以完美工作。它非常簡單的解決方案 – oli