2016-08-19 25 views
6

Rozważmy Mam model: Company 1 - N OsobaGreenDAO Lewy Dołącz

chcę, aby wyświetlić listę osób wraz z ich nazwami i nazwę firmy. Ale nie każda osoba ma firmę.

I aby uniknąć że każde wywołanie person.getCompany() wyników w nowym zapytaniu SQL więc myślałem o dodanie dołączyć:

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

Problemem jest to, że dostanę osoby z firmy tylko dlatego, że generowany zapytanie używa JOIN, które jest równoważne INNER JOIN. Myślę, że potrzebowałbym LEFT JOIN, aby również pozyskać osoby bez towarzystwa.

Nie wydaje GreenDAO obsługuje LEFT JOIN teraz. Czy istnieje inny sposób na zrobienie wniosku bez wykonania surowego zapytania?

+0

Jeśli jesteś otwarty na używanie innej ORM, mogę zasugerować JDXA ORM (http://softwaretree.com/v1/products/jdxa/jdxa.html). JDXA pobierze wszystkie kwalifikowane obiekty Person i wszelkie powiązane obiekty firmy. Jeśli powiązany obiekt firmy nie istnieje, obiekt Person nadal będzie pobierany. –

Odpowiedz

0

Można to osiągnąć bez pisania surowego zapytania.

Oto fragment:

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

on kompiluje na niskim poziomie jak:

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" 

Oczywiście jeśli model Person ma inne stosunki, wszystkie z nich zostaną pobrane, więc to SQL zapytanie będzie wolne.

jednak w zasadzie nie, czego oczekujesz.

+0

Nie sądzę, aby queryDeep() nie były bardzo wydajne w moim przypadku. I potrzebowałbym również klauzuli where, która jest w pewnym stopniu równoważna zapytaniu raw przy użyciu queryDeep(). –

+0

Tak, musisz podać ręcznie napisaną klauzulę Where podobną do opisanej w [Greendao samples] (https://github.com/greenrobot/greenDAO/blob/1d267398b17ec5e24afffc66e295b469718902a8/tests/DaoTest/src/androidTest/java/org /greenrobot/greendao/daotest/entity/RelationEntityTest.java#L166) –