GreenDAO 左连接

6
考虑我有一个模型: 公司 1 - N 人
我想显示一个人员列表,包括他们的姓名和所在公司的名称。但不是每个人都有公司。
为了避免每次调用person.getCompany()都会导致新的SQL查询,因此我考虑添加一个联接:
QueryBuilder<Person> queryBuilder = session.getPersonDao().queryBuilder();
queryBuilder.join(PersonDao.Properties.CompanyId, Company.class);
queryBuilder.list()

问题是我只得到了有公司的人,因为生成的查询使用的是JOIN,这相当于INNER JOIN。我认为我需要LEFT JOIN来获得没有公司的人。
现在似乎GreenDAO不支持LEFT JOIN。有没有其他方法可以在不执行原始查询的情况下进行请求?

如果您愿意使用不同的ORM,我可以建议使用JDXA ORM(http://softwaretree.com/v1/products/jdxa/jdxa.html)。 JDXA将获取所有合格的Person对象和任何关联的Company对象。 如果关联的Company对象不存在,则仍将获取Person对象。 - Damodar Periwal
2个回答

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查询会很慢。
但是,它基本上做到了你所期望的。

我认为在我的情况下,queryDeep() 不会非常高效。而且当使用 queryDeep() 时,我还需要一个 where 子句,这在某种程度上相当于原始查询。 - Yohan D
是的,您需要传递手写的Where子句,类似于Greendao样例中描述的那样。 - R. Zagórski

0

对于那些不知道如何使用原始查询的人:

String query = " LEFT JOIN COMPANY ON T.id = COMPANY.ID where SOME_CONDITIONS";
List<Person> persons = session.getPersonDao().queryRaw(query);

Greendao会自动插入 SELECT T.COLUMN_1, ... T.COLUM_N from PERSON AS T 部分。
所以在查询中T只是表Person的别名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接