2015-05-27 53 views
2

我試圖想出一個動態查詢,並基於我所做的研究,看起來像我最好的選擇是選擇生成器,因爲我想使用註釋而不是XML。MyBatis選擇生成器

我有兩個參數;一個列表和一個對象,我想傳遞給此查詢生成器方法。我可以使用沒有問題的對象,但不能從方法訪問列表。

這裏是我的映射器接口:

@SelectProvider(type = ProductProvider.class, method = "getProductByBrandByCategory") 
List<Product> getProductListByBrandByCategory(@Param("brandList") List<Brand> brandList, @Param("category") Category category); 

這裏是getProductByBrandByCategory方法是ProductProvider類:

public String getProductByBrandByCategory(Map params) { 
    return new SQL() {{ 
     SELECT("*"); 
     FROM("product"); 
     WHERE("category_id = #{category.id}"); 
    }}.toString(); 
} 

基本上,我試圖通過列表迭代添加和/或/ where語句基於列表中的元素。

有沒有一種方法可以訪問brandList元素?我的猜測是它是地圖參數的一部分,但不知道如何訪問它。

在此先感謝。

回答

1

查看this question作爲示例如何獲取colection中的參數。從列舉的問題

public class CategoryDaoSelectProvider { 
public static String findByParentIdAndName(Map<String, Object> params) { 
    Long parentId = (Long)params.get("parentId"); // WHY IS THIS HERE??? 

    StringBuffer buffer = new StringBuffer(); 
    buffer.append("SELECT COUNT(id) FROM Category "); 

    if (parentId == null) { 
     buffer.append("WHERE parentId IS NULL "); 
    } else { 
     buffer.append("WHERE parentId = #{parentId} "); 
    } 

    buffer.append("AND LOWER(name) = LOWER(#{name}) "); 

    return buffer.toString(); 
} 

} 代碼示例

其他的解決方案

  • 你可以使用MyBatis Velocity使用Apache速度腳本語言 生成動態SQL查詢。

  • 您還可以使用基於XML的映射定義,他們的工作真的好爲你的情況

引用offical documentation,部分「映射批註」

,Java註解不幸的是在有限的表現力和靈活性。儘管大量的勘察,設計和試驗所花費的時間,最強大的MyBatis映射不能用註解

內置

從我的商業經驗MyBatis的XML配置的作品真的很好(我們使用的MyBatis與Spring)。金額樣板代碼是最小的 - 只是查詢和resultMaps。即使使用XML標籤中的某些邏輯(如果,foreach等),XML語法也很容易閱讀。基於註釋的配置需要複雜的嵌套註釋,即使對於最簡單的映射也不需要。我們仍然有一些mapers的註釋,但對於新代碼,我更喜歡XML。

IntelliJ IDEA將映射器接口方法與XML SQL定義鏈接起來,因此導航非常簡單。