2012-07-26 70 views
7

使用ORMLite for Android,我需要構建一個查詢,通過訂單ID或客戶名稱返回訂單。請考慮下面的類聲明:ORMLite - 查詢國外字段

@DatabaseTable(tableName = "order") 
public class Order { 
    @DatabaseField(generatedId = true) 
    private Long id; 

    @DatabaseField(foreign = true, canBeNull = false, foreignAutoRefresh = true, columnName = "customer_id") 
    private Customer customer; 

    // default constructor, getters and setters... 
} 

@DatabaseTable(tableName = "customer") 
public class Customer { 
    @DatabaseField(generatedId = true) 
    private Long id; 

    @DatabaseField 
    private String name; 

    // default constructor, getters and setters... 
} 

原始SQL我正在尋找將是這樣的:

SELECT 
    o.* 
FROM 
    order o 
    JOIN customer c on 
     o.customer_id = c.id 
WHERE 
    (o.id = ?) OR (c.name = ?) 

什麼是做到這一點使用ORMLite的最佳方式?

+0

http://stackoverflow.com/questions/17618198/error-in-query-with-join-with-ormlite 請幫助我: (@Gray – fabiodresch 2013-07-15 21:12:14

回答

12

ORMLite現在支持simple join queries

所以您的查詢看起來是這樣的:

QueryBuilder<Customer, Integer> customerQb = customerDao.queryBuilder(); 
SelectArg nameSelectArg = new SelectArg(); 
// this gives the c.name = ? 
customerQb.where().eq("name", nameSelectArg); 
QueryBuilder<Account, Integer> orderQb = orderDao.queryBuilder(); 
SelectArg idSelectArg = new SelectArg(); 
// this gives the o.id = ? 
orderQb.where().eq("id", idSelectArg); 
orderQb.join(customerQb); 
// then you set the args and run the query 
nameSelectArg.setValue("jim"); 
idSelectArg.setValue(1); 
List<Order> results = orderQb.join(customerQb).query(); 
+0

Gray,我們只是將OrmLite看作Android上一個潛在的ORM,並注意到關係是通過單獨的查詢而不是連接加載的,因此遭受了N + 1問題。以這種方式實施它的理由是什麼?目前這意味着100'A'上的'queryForAll'每個都有一個'B'將發出101個查詢而不是一個。 1查詢獲取所有'A's,然後另外100個查詢爲每個'A'獲取'B'。 – Matthias 2013-03-12 19:01:30

+0

簡短的答案是因爲它不是ORMHeavy @Matthias。我收到一些人抱怨它的代碼大小和一些缺失的功能... – Gray 2013-03-12 19:04:21

+0

好吧,夠公平的。雖然有很多其他功能,但我認爲這是一個奇怪的遺漏。這是一種常見的反模式,我認爲這種模式違背了它自己的目的,因爲它要求客戶自己執行映射,除非他們想要吞下這個額外的成本(這很大並且隨着表大小而增加) – Matthias 2013-03-12 19:08:50

0

沒有,連接在ORMLite https://stackoverflow.com/a/7320091/323128 支持,但this reference會給視力如何完成你的任務

+0

在這種情況下,我可以使用原始查詢。是否有可能從原始查詢中獲得列表?或者我可以使用GenericRawResults嗎? – itmartins 2012-07-26 16:11:05

+0

DOC:queryRaw方法返回一個GenericRawResults對象,它表示一個結果爲字符串數組,對象數組或用戶映射對象 - 因此,您可以構建一個組合對象,您將在結果上映射以獲取某種數據的容器更好然後數組字符串 – Maxim 2012-07-26 17:33:23

+0

感謝美心,你一直很有幫助。但是,我的實際Order類有20多個屬性,這使得映射每個屬性以獲取Order對象變得非常費力。 – itmartins 2012-07-26 18:43:00