2014-06-18 82 views
1

我無法找到一種方法來動態傳遞@ResultMap的值。動態傳遞@ResultMap的值

例如:

@Select( 「選擇從表名*」)

@ResultMap( 「SomeResultMap」)

公共列表getAllMethod()

在上面的例子中,我想要動態地傳遞@ResultMap的值,而不是使用「SomeResultMap」進行硬編碼。

任何幫助添加上述功能將不勝感激。

回答

0

雖然可能得到「動態註釋」中的一個(非常)迂迴的方式,它增加了大量的開銷,我認爲很可能會遠遠更多地參與/複雜不是簡單地多select s的不同ResultMap註釋。

關於什麼的開銷將需要更多的信息,請參閱Dynamic class annotation

除非你需要在運行時動態地創建大量的這些值,而這些值並不是事先知道的(在這種情況下,我會認爲這些在運行時映射下的查詢也不會是已知,所以目前還不清楚該用例是什麼),我會建議堅持硬編碼的註釋。響應

編輯從OP評論:

對於那些你不知道確切的參數,你可以跟着我添加了動態標註的聯繫,案件,但因爲我(和其他人在該鏈接)說過,我認爲這最終會變得更加複雜,並最終不會真正避免明確地定義一堆事情(即最終不會變得如此動態)。

所以我會推薦硬編碼的ResultMap s,但有一點要記住的是,你真的只需要使用ResultMap s更復雜的映射。通常可以在幕後使用隱含的ResultMap s,通過在您的POJO Bean s上將列別名爲setter

這將需要使用SELECT *SELECT <col list>切換,但IMO,通常更好的是,無論如何,因爲它是一個明確的列表,你可以用副作用少加列一個表的方式(即他們不會自動獲得包含在結果集中並可能影響程序行爲)。

+0

查詢是已知的,但參數未知。假設,@Select(「select * from table_name」)。在這種情況下,我知道查詢,但爲了獲得域對象,我會動態地傳遞結果圖。 – parvez

0

有幾種方法,使我們可以看看解決這個問題(在一定程度上迂迴的方式):

  1. 由於查詢是相同的,我們可以把它解壓到一個接口不變。現在我們可以讓特定的Result擴展覆蓋此方法的Mapper接口,並且在定義方法時引用接口常量並添加特定的ResultMap。

Mapper.java

interface Mapper { 
    static final String SELECT_QUERY="select * from $tableName"; 
    List getAllMethod(@Param("tableName")String tableName); 
} 

FooMapper.java

interface FooMapper extends Mapper { 
    @Select({SELECT_QUERY}) 
    @ResultMap("FooMapper.Foo") 
    List getAllMethod(@Param("tableName")String tableName); 
} 

現在我們可以注入到配置這種特定的映射,並將它用。這是有用的,查詢是複雜的,在一個地方被抽象

  • 我們可以使用了Javassist來動態創建一個新的映射器類,將與加@ResultMap註解正確的命名空間。這可以在將映射器添加到配置的DAO中完成。

  • 我們可以爲@ResultMap放置一個佔位符值,並通過切入點使用AspectJ將其替換爲正確的值。我還沒有嘗試過,但https://bugs.eclipse.org/bugs/show_bug.cgi?id=313026可能是這裏的阻擋者。

  • 是的,這些看起來很醜,但應該工作。但是,如果MyBatis支持爲ResultMap表達式插入@Param值,情況會更好。

    希望這會有所幫助!