2016-08-19 4 views
6

Betrachten Ich habe ein Modell: Firma 1 - N PersonGreenDAO LEFT JOIN

Ich möchte mit ihren Namen und ihre Firmennamen eine Liste von Personen angezeigt werden soll. Aber nicht jede Person hat eine Firma.

bestelle ich jeden Anruf person.getCompany() Ergebnisse in einer neuen SQL-Abfrage zu vermeiden, dass so etwa dachte ich eine Zugabe beitreten:

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

Das Problem ist, dass ich nur die Personen mit einem Unternehmen erhalten, weil die erzeugte query verwendet JOIN, was INNER JOIN entspricht. Ich denke, ich brauche LEFT JOIN, um auch die Personen ohne Firma zu bekommen.

Es scheint nicht GreenDAO unterstützt LEFT JOIN jetzt. Gibt es eine andere Möglichkeit, die Anfrage ohne eine rohe Anfrage zu stellen?

+0

Wenn Sie ein anderes ORM verwenden möchten, kann ich JDXA ORM vorschlagen (http://softwaretree.com/v1/products/jdxa/jdxa.html). JDXA ruft alle qualifizierten Person-Objekte und alle zugehörigen Company-Objekte ab. Wenn ein zugehöriges Firmenobjekt nicht existiert, wird ein Personenobjekt trotzdem abgerufen. –

Antwort

0

Es kann erreicht werden, ohne eine rohe Abfrage zu schreiben. Hier

ist das Snippet:

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

Es befindet sich auf niedrigem Niveau kompiliert wie:

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" 

Natürlich, wenn die Person Modell andere Beziehungen, die alle von ihnen werden abgeholt werden, so dass diese SQL Abfrage wäre langsam.

Allerdings tut es im Grunde, was Sie erwarten.

+0

Ich denke nicht, dass queryDeep() in meinem Fall nicht sehr effizient wäre. Und ich würde auch eine where-Klausel benötigen, die bei Verwendung von queryDeep() einer unbearbeiteten Abfrage entspricht. –

+0

Ja, Sie müssten eine handgeschriebene Where-Klausel übergeben, die der in [Greendao samples] beschriebenen ähnelt (https://github.com/greenrobot/greenDAO/blob/1d267398b17ec5e24afffc66e295b469718902a8/tests/DaoTest/src/androidTest/java/org /greenrobot/greendao/daotest/entity/RelationEntityTest.java#L166) –