2014-03-04 61 views
0

是否有可能映射在一个查询即使用MyBatis的注解嵌入对象:
Foo类: 的MyBatis - constructorArgs注释和嵌入对象

public class Foo //immutable 
{ 
private final Integer fooId; 
private final String fooAttr; 
private final Bar bar; 
public Foo(Integer fooId, String fooAttr, Bar bar) //constructor 
} 

酒吧类:

public class Bar { //immutable 
private final Integer barId; 
private final String barAttr; 
public Bar(Integer barId, String barAttr) //constructor 
} 

表FooBar的:

- INT foo_id 
- CHAR foo_attr 
- INT bar_id 
- CHAR bar_attr 

查询:

@ConstructorArgs({ 
    @Arg(column="foo_id", javaType=Integer.class), 
    @Arg(column="foo_attr", javaType=String.class), 
    Bar ? 
}) 
Select("select * from FooBar where foo_id=#{fooId}" 
public Foo getFooBy(@Param("fooId") Integer fooId); 

如何将Bar类映射为Foo构造函数参数(不使用子查询)?

回答

1

我知道,这是痛苦的,但下面的工作:

@ConstructorArgs({ 
    @Arg(column="foo_id", javaType=Integer.class), 
    @Arg(column="foo_attr", javaType=String.class), 
    @Arg(column="bar_id", javaType=Integer.class), 
    @Arg(column="bar_attr", javaType=String.class) 
}) 

然后构造应该是这样的:

public Foo(Integer fooId, String fooAttr, Integer barId, String barAttr) 
    this.fooId = fooId; 
    this.fooAttr = fooAttr; 
    this.bar = new Bar(barId, barAttr); 
} 

你甚至可以离开酒吧空,如果ID未设置:

public Foo(Integer fooId, String fooAttr, Integer barId, String barAttr) 
    this.fooId = fooId; 
    this.fooAttr = fooAttr; 
    if (barId != null) { 
     this.bar = new Bar(barId, barAttr); 
    } 
}