簡體   English   中英

Orika是否支持從java.util.Set映射?

[英]Does Orika support mapping from java.util.Set?

我以前曾使用Orika在許多不同的對象和集合之間成功映射,但是在嘗試將java.util.Set映射到一系列字段時遇到了問題。 如果可能的話,我最好不要將Set更改為SortedSet或List。

SourceObject具有Set SetField屬性,DestinationObject具有我嘗試映射到的各種String屬性。

    mapperFactory.classMap(SourceObject.class, DestinationObject.class)
            .field("setField[0].propertyOne", "destinationOnePropertyOne")
            .field("setField[0].propertyTwo", "destinationOnePropertyTwo")
            .field("setField[1].propertyOne", "destinationTwoPropertyOne")
            .field("setField[1].propertyTwo", "destinationTwoPropertyTwo")

嘗試此操作將在運行測試時引發以下異常:

Caused by: compile error: get(int) not found in java.util.Set
at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:723)
at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:688)
at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:157)
at javassist.compiler.ast.CallExpr.accept(CallExpr.java:46)
at javassist.compiler.TypeChecker.atCastExpr(TypeChecker.java:547)
at javassist.compiler.JvstTypeChecker.atCastExpr(JvstTypeChecker.java:104)
at javassist.compiler.ast.CastExpr.accept(CastExpr.java:55)
at javassist.compiler.TypeChecker.booleanExpr(TypeChecker.java:515)
at javassist.compiler.TypeChecker.atBinExpr(TypeChecker.java:337)
at javassist.compiler.ast.BinExpr.accept(BinExpr.java:41)
at javassist.compiler.TypeChecker.booleanExpr(TypeChecker.java:527)
at javassist.compiler.TypeChecker.atBinExpr(TypeChecker.java:337)
at javassist.compiler.ast.BinExpr.accept(BinExpr.java:41)
at javassist.compiler.TypeChecker.booleanExpr(TypeChecker.java:523)
at javassist.compiler.TypeChecker.atExpr(TypeChecker.java:592)
at javassist.compiler.ast.Expr.accept(Expr.java:68)
at javassist.compiler.TypeChecker.booleanExpr(TypeChecker.java:527)
at javassist.compiler.TypeChecker.atBinExpr(TypeChecker.java:337)
at javassist.compiler.ast.BinExpr.accept(BinExpr.java:41)
at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:242)
at javassist.compiler.CodeGen.compileBooleanExpr(CodeGen.java:236)
at javassist.compiler.CodeGen.atIfStmnt(CodeGen.java:384)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:355)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.CodeGen.atMethodBody(CodeGen.java:292)
at javassist.compiler.CodeGen.atMethodDecl(CodeGen.java:274)
at javassist.compiler.ast.MethodDecl.accept(MethodDecl.java:44)
at javassist.compiler.Javac.compileMethod(Javac.java:169)
at javassist.compiler.Javac.compile(Javac.java:95)
at javassist.CtNewMethod.make(CtNewMethod.java:74)
... 79 more

看起來Orika假設集合上有一個get(int)方法,而不是嘗試使用迭代器。 是否有堅持使用Set的方法,或者我需要做一些重構才能使用其他Collection類型?

感謝您的任何想法!

您正在嘗試通過索引訪問集合元素,這就是問題所在。

如果要保留集合,則不應按索引映射元素,而應使用List。

我有同樣的問題,這就是我使用的解決方案。

您必須將hbm從<set>標記更改為<bag>標記(在我的情況下,我僅更改了開始標記,沒有其他選項,並且都像以前一樣工作了),例如(Request.hbm):

<bag name="Solutions" table="S_SOLUTION" batch-size="20">
   <key>
      <column name="REQUEST_ID" not-null="true" />
    </key>
    <many-to-many entity-name="com.model.Solution">
        <column name="SOLUTION_ID" not-null="true" />
    </many-to-many>
</bag>

在必須更改Bean文件之后, SetList ,例如(Request.java):

private List<Solution> Solutions = new ArrayList<Solution>();
public List<Solution> getSolutions() {
    return Solutions;
}
public void setSolutions(List<Solution> sSolutions) {
    Solutions = sSolutions;
}

最后,Orika可以映射索引為0的第一個元素,例如:

.field("solutionCreated","Solutions[0].creatorFullName")
.field("solutionText","Solutions[0].resolutionText")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM