2013-08-09 33 views
5

Tôi đang cố gắng truy vấn một bảng dựa trên các tiêu chí từ bảng kết nối sử dụng ORMLite.ORMLite hoặc truy vấn trên nhiều bảng

Sau đây là cách tôi sẽ thể hiện các truy vấn Tôi cố gắng để viết trong TSQL:

select * from media m inner join file f on m.fileId = f.fileId 
where m.isNew = 1 OR f.isNew = 1 

Kết quả phải là một danh sách các hồ sơ phương tiện truyền thông mà một trong hai kỷ lục truyền thông hoặc các bản ghi tập tin tương ứng có isNew = 1

Tôi đã đọc qua tài liệu về cách sử dụng OR trong ORMLite, nhưng tất cả các ví dụ đều sử dụng một bảng duy nhất, không tham gia. Tương tự như vậy, tôi đã đọc tài liệu về các phép nối, nhưng không có ví dụ nào bao gồm mệnh đề where mở rộng cả hai bảng. Có cách nào ngoài một truy vấn thô để làm điều này không?

Tôi đã xem câu hỏi này: https://stackoverflow.com/a/12629645/874782 và dường như cũng hỏi điều tương tự, nhưng câu trả lời được chấp nhận tạo ra truy vấn AND chứ không phải OR. Đây là mã của tôi mà tôi sử dụng để kiểm chứng giả thuyết rằng:

public List<Media> getNewMedia() { 
    Session session = getSession(); 
    Account account = session.getSelectedAccount(); 
    ContentGroup contentGroup = account.getSelectedContentGroup(); 

    List<Media> results = null; 

    try { 

     QueryBuilder<Category, Integer> categoryQueryBuilder = getHelper().getCategoryDao().queryBuilder(); 
     categoryQueryBuilder.where().eq("group_id", contentGroup.getId()); 

     QueryBuilder<MediaCategory, Integer> mediaCatQb = getHelper().getMediaCategoryDao().queryBuilder(); 
     mediaCatQb = mediaCatQb.join(categoryQueryBuilder); 

     QueryBuilder<FileRecord, Integer> fileQueryBuilder = getHelper().getFileDao().queryBuilder(); 
     fileQueryBuilder.where().ge("lastUpdated", contentGroup.getLastDownload()); 

     QueryBuilder<Media, Integer> mediaQb = getHelper().getMediaDao().queryBuilder(); 
     mediaQb.where().eq("seen", false); 
     // join with the media query 
     results = mediaQb.join(fileQueryBuilder).join(mediaCatQb).query(); 

    } catch (SQLException e) { 
     Log.e(TAG, "Sql Exception", e); 
    } 

    return results; 
} 

Đối với mục đích hoàn chỉnh, điều này được truy vấn cho một ví dụ hơi phức tạp hơn so với cái tôi đã ở trên, điều này thể hiện trong TSQL sẽ

select * from Media m join FileRecord f on m.fileRecordId = f.fileRecordId 
where m.seen = false OR f.lastUpdated >= lastUpdateDate 

Khi tôi chạy nó, nó thực sự đang thực hiện truy vấn AND, đó là những gì tôi mong đợi dựa trên hai phép nối với độc lập với mệnh đề.

Tôi nghĩ rằng vấn đề chính là một mệnh đề where vốn được gắn với một bảng, bởi vì nó được thực hiện trên đối tượng QueryBuilder đến từ một Dao cụ thể cho bảng đó. Làm sao để tôi có được xung quanh này?

Trả lời

0

Tôi nghĩ rằng những gì bạn đang tìm kiếm là joinOr tìm kiếm trong số ORMLite docs.

Giống như tham gia (QueryBuilder) nhưng kết hợp câu lệnh WHERE của hai số trình tạo truy vấn có SQL "OR".

Các vấn đề liên quan