我無法找到一種方法來動態傳遞@ResultMap的值。動態傳遞@ResultMap的值
例如:
@Select( 「選擇從表名*」)
@ResultMap( 「SomeResultMap」)
公共列表getAllMethod()
在上面的例子中,我想要動態地傳遞@ResultMap的值,而不是使用「SomeResultMap」進行硬編碼。
任何幫助添加上述功能將不勝感激。
我無法找到一種方法來動態傳遞@ResultMap的值。動態傳遞@ResultMap的值
例如:
@Select( 「選擇從表名*」)
@ResultMap( 「SomeResultMap」)
公共列表getAllMethod()
在上面的例子中,我想要動態地傳遞@ResultMap的值,而不是使用「SomeResultMap」進行硬編碼。
任何幫助添加上述功能將不勝感激。
雖然可能得到「動態註釋」中的一個(非常)迂迴的方式,它增加了大量的開銷,我認爲很可能會遠遠更多地參與/複雜不是簡單地多select
s的不同ResultMap
註釋。
關於什麼的開銷將需要更多的信息,請參閱Dynamic class annotation。
除非你需要在運行時動態地創建大量的這些值,而這些值並不是事先知道的(在這種情況下,我會認爲這些在運行時映射下的查詢也不會是已知,所以目前還不清楚該用例是什麼),我會建議堅持硬編碼的註釋。響應
編輯從OP評論:
對於那些你不知道確切的參數,你可以跟着我添加了動態標註的聯繫,案件,但因爲我(和其他人在該鏈接)說過,我認爲這最終會變得更加複雜,並最終不會真正避免明確地定義一堆事情(即最終不會變得如此動態)。
所以我會推薦硬編碼的ResultMap
s,但有一點要記住的是,你真的只需要使用ResultMap
s更復雜的映射。通常可以在幕後使用隱含的ResultMap
s,通過在您的POJO Bean
s上將列別名爲setter
。
這將需要使用SELECT *
到SELECT <col list>
切換,但IMO,通常更好的是,無論如何,因爲它是一個明確的列表,你可以用副作用少加列一個表的方式(即他們不會自動獲得包含在結果集中並可能影響程序行爲)。
有幾種方法,使我們可以看看解決這個問題(在一定程度上迂迴的方式):
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值,情況會更好。
希望這會有所幫助!
查詢是已知的,但參數未知。假設,@Select(「select * from table_name」)。在這種情況下,我知道查詢,但爲了獲得域對象,我會動態地傳遞結果圖。 – parvez