2016-08-19 13 views
6

Cân nhắc tôi có một mô hình: Công ty 1 - N PersonGreenDAO Left Tham

Tôi muốn hiển thị một danh sách các người có tên họ và tên của công ty họ. Nhưng không phải mọi người đều có một công ty.

tôi đặt hàng để tránh điều đó mỗi cuộc gọi đến person.getCompany() kết quả trong một truy vấn SQL mới vì vậy tôi đã suy nghĩ về việc thêm một tham gia:

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

Vấn đề là tôi chỉ nhận người có một công ty vì tạo truy vấn sử dụng JOIN tương đương với INNER JOIN. Tôi nghĩ tôi sẽ cần LEFT JOIN để có được những người không có một công ty.

Dường như GreenDAO không hỗ trợ LEFT JOIN ngay bây giờ. Có cách nào khác để đưa ra yêu cầu mà không cần truy vấn thô không?

+0

Nếu bạn mở để sử dụng ORM khác, tôi có thể đề xuất JDXA ORM (http://softwaretree.com/v1/products/jdxa/jdxa.html). JDXA sẽ lấy tất cả các đối tượng Person đủ điều kiện và bất kỳ đối tượng Công ty liên quan nào. Nếu một đối tượng Công ty liên quan không tồn tại, một đối tượng Person sẽ vẫn được tìm nạp. –

Trả lời

0

Có thể đạt được mà không cần viết truy vấn thô.

Dưới đây là đoạn:

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

Nó biên dịch ở mức thấp như:

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" 

Tất nhiên nếu mô hình Person có quan hệ khác, tất cả trong số họ sẽ được lấy, vì vậy SQL này truy vấn sẽ chậm.

Tuy nhiên, về cơ bản, điều bạn mong đợi.

+0

Tôi không nghĩ queryDeep() sẽ không hiệu quả trong trường hợp của tôi. Và tôi cũng sẽ cần một mệnh đề where, tương đương với một truy vấn thô khi sử dụng queryDeep(). –

+0

Có, bạn sẽ cần phải vượt qua bằng tay được viết Điều khoản tương tự như được mô tả trong [mẫu Greendao] (https://github.com/greenrobot/greenDAO/blob/1d267398b17ec5e24afffc66e295b469718902a8/tests/DaoTest/src/androidTest/java/org /greenrobot/greendao/daotest/entity/RelationEntityTest.java#L166) –