2016-08-19 144 views
6

考慮我有一個模型: 公司1 - N的人GreenDAO左連接

我想顯示他們的名字和他們公司的名字的人的名單。 但並非每個人都有一家公司。

我爲了避免在新的SQL查詢來person.getCompany()結果每次調用,所以我在想添加一個連接:

QueryBuilder<Person> queryBuilder = session.getPersonDao().queryBuilder(); 
queryBuilder.join(PersonDao.Properties.CompanyId, Company.class); 
queryBuilder.list() 

的問題是,我只得到了公司的人,因爲產生查詢使用等效於INNER JOIN的JOIN。我認爲我需要LEFT JOIN才能找到沒有公司的人。

現在看來GreenDAO並不支持LEFT JOIN。是否有另一種方法可以在不進行原始查詢的情況下提出請求?

+0

如果您打算使用不同的ORM,我可以推薦使用JDXA ORM(http://softwaretree.com/v1/products/jdxa/jdxa.html)。 JDXA將獲取所有合格的Person對象和任何關聯的公司對象。如果關聯的公司對象不存在,則仍會提取Person對象。 –

回答

0

它可以在不寫入原始查詢的情況下實現。

下面是摘錄:

QueryBuilder<Person> qb = userDao.queryBuilder(); 
List<Person> outputPersonList = userDao.queryDeep(" ", null); 

它編譯在較低水平:

SELECT T."_id",T."NAME",T."COMPANY_ID",T0."_id",T0."NAME" 
    FROM PERSON T 
    LEFT JOIN COMPANY T0 
    ON T."COMPANY_ID"=T0."_id" 

當然如果Person模型有其他關係,他們都將被取出,所以這SQL查詢會很慢。

但是,它基本上是,你期望的。

+0

我不認爲queryDeep()在我的情況下不會很有效。而且我還需要一個where子句,這在使用queryDeep()時與原始查詢相當。 –

+0

是的,您需要將手寫的Where子句與[格林多樣本]中描述的相似(https://github.com/greenrobot/greenDAO/blob/1d267398b17ec5e24afffc66e295b469718902a8/tests/DaoTest/src/androidTest/java/org /greenrobot/greendao/daotest/entity/RelationEntityTest.java#L166) –