2016-01-08 32 views
1

我正在使用jOOQ,我不太確定我是否按照我應該的方式使用它。我想知道下面的代碼是否可以寫得更優雅。由「優雅地」我的意思是,這是相當煩人的基本上關於任何關於列。如果我添加,刪除或更改列的順序,我將不得不更改所有結果和對象等。我相當肯定,在未來我會遇到類似於以下幾次的請求,因此我希望知道我能否簡化這一點。這個提取可以做得更「優雅」嗎?

另外,我注意到on.fetch()和類似的結果是Result<Record6<..>>。我看了看那些RecordX類。其中有22個。我不認爲我會永遠需要這個,但如果我想讀23列?

public List<StoreItemDTO> getItems(Long storeId) { 

    // Get all item_ids for the store 

    SelectConditionStep<Record1<Long>> where = this.ctx 
    .select(STORE_ITEM.ID) 
    .from(STORE_ITEM) 
    .where(STORE_ITEM.STORE_ID.eq(storeId)); 

    // Get all store_item_details (all languages) according to the fetched item_ids 

    Table<Record5<Long, Long, String, String, Long>> storeItemDetails = this.ctx 
    .select(
     STORE_ITEM_DETAILS.ID, 
     STORE_ITEM_DETAILS.STORE_ITEM_ID, 
     STORE_ITEM_DETAILS.NAME, 
     STORE_ITEM_DETAILS.DESCRIPTION, 
     STORE_ITEM_DETAILS.STORE_LANGUAGE_ID 
     ) 
    .from(STORE_ITEM_DETAILS) 
    .where(STORE_ITEM_DETAILS.STORE_ITEM_ID.in(where)) 
    .asTable("storeItemDetails"); 

    // Join the result and get the items for the store in all languages 

    SelectOnConditionStep<Record6<Long, Long, Long, String, String, Long>> on = this.ctx 
    .select(
     STORE_ITEM.ID, 
     STORE_ITEM.STORE_ID, 
     storeItemDetails.field(STORE_ITEM_DETAILS.ID), 
     storeItemDetails.field(STORE_ITEM_DETAILS.NAME), 
     storeItemDetails.field(STORE_ITEM_DETAILS.DESCRIPTION), 
     storeItemDetails.field(STORE_ITEM_DETAILS.STORE_LANGUAGE_ID)   
     ) 
    .from(STORE_ITEM) 
    .join(storeItemDetails) 
    .on(storeItemDetails.field(STORE_ITEM_DETAILS.STORE_ITEM_ID).eq(STORE_ITEM.ID)); 

    Result<Record6<Long, Long, Long, String, String, Long>> fetch = on.fetch(); 

    // .. 

    return null; 
} 
+1

'fetchMaps()'那麼你可以通過列名訪問? [http://www.jooq.org/doc/2.5/manual/sql-execution/fetching/](http://www.jooq.org/doc/2.5/manual/sql-execution/fetching/) – Valijon

+0

@ Valijon我猜這可能是'fetch()'的替代方案。 – displayname

回答

2

如果您不需要類型安全,請不要使用它。例如。下面的作品就好了,太

// Get all item_ids for the store 
SelectConditionStep<?> where = this.ctx... 

// Get all store_item_details (all languages) according to the fetched item_ids 
Table<?> storeItemDetails = this.ctx... 

// Join the result and get the items for the store in all languages 
SelectOnConditionStep<Record6<Long, Long, Long, String, String, Long>> on = this.ctx... 

擴展類型安全是非常不錯的編譯器時,它可以執行類型推斷,例如當你寫:

  • UNION小號
  • IN謂詞
  • 當你取你的結果變成lambda表達式

你可能會寫所有這些類型的下降因爲您正在使用IDE自動完成功能,並且您的IDE首先提出了最具體的建議。但是使用通配符將工作一樣,在上述情況下,像這樣的例如爲:

Result<?> fetch = this.ctx 
        // .. 
        .fetch(); 

for(Record record : fetch) {    
    String value = record.getValue(STORE_ITEM_DETAILS.NAME);    
    System.out.println(value); 
} 

我不認爲我會永遠需要一個,但如果我想讀23列是什麼?

沒有顯着變化。參見手冊: http://www.jooq.org/doc/latest/manual/sql-execution/fetching/record-n

您仍然可以選擇是否使用明確的記錄類型(在記錄中沒有度):

Result<Record> result = query.fetch(); 

...或者你是否使用通配符:

Result<?> result = query.fetch(); 
+0

我允許自己做一個編輯。我不知道我可以使用getValue(字段字段)從'Record'中獲得字段':)非常感謝! – displayname

+0

@StefanFalk:哦,真的嗎?因此,您總是通過索引對它們進行解除引用,例如'record.value3()'?噢,我的:)是的,這個用法使事情變得更容易... :) –

+0

:D不,說實話我沒有來到「從服務器獲取數據」部分。 ^^我的項目在冬季學期停了下來,我花了很多時間設計抽象層並學習Spring Security等。:) – displayname