2016-08-19 106 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) –