2016-08-19 10 views
6

は、私がモデルを持って考えてみましょう。 しかし、すべての人に会社があるわけではありません。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オブジェクトと関連するすべてのCompanyオブジェクトを取得します。関連するCompanyオブジェクトが存在しない場合、Personオブジェクトは引き続きフェッチされます。 –

答えて

0

生のクエリを書き込まなくても達成できます。ここで

は抜粋です:

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

それはのような低レベルでコンパイルされます:Personモデルは、それらのすべてがフェッチされる、他の関係を持っているので、このSQL場合

もちろん
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" 

クエリは遅くなります。

しかし、基本的には、あなたが期待していることです。

+0

私はqueryDeep()が私の場合はあまり効率的ではないとは思わない。また、where節も必要になります。これは、queryDeep()を使用しているときの未処理クエリと同じです。 –

+0

はい、[Greendao samples](https://github.com/greenrobot/greenDAO/blob/1d267398b17ec5e24afffc66e295b469718902a8/tests/DaoTest/src/androidTest/java/org)に記載されているのと同様のWhere節を書かれた手を渡す必要があります。 /greenrobot/greendao/daotest/entity/RelationEntityTest.java#L166) –