我尝试使用MyBatis从数据库对象获取,该对象具有另一个对象作为字段。像这样:
public class Worker {
private int id;
private String firstName;
private String lastName;
private Bank bank;
}
public class Bank {
private int id;
private String name;
}
可以看出,这里应该是一对一的关系。 目前我发现只有两个解决方案:
1)参考银行sql将@Result注释添加到WorkerMapper,如下所示:
public interface WorkerMapper {
@Results({
@Result(column = "id", property = "id"),
@Result(column = "first_name", property = "firstName"),
@Result(column = "last_name", property = "lastName"),
@Result(property="bank", javaType=Bank.class, column="id", many=@Many(select="getBank"))
})
@Select("worker select")
Worker get(int id);
@Select("bank select")
Bank getBank(int id);
)
但是,如果我理解正确,如果我这样做,我需要为银行和工人执行两个查询^。这对BD来说不是很好
2)我可以用“内连接”编写sql查询,创建一些“RowAdapter”类,其中包含所有查询字段。从数据库中获取后,我将解析我的必要对象。 这个解决方案比两个查询要好,但是有必要编写很多代码。
在MyBatis中是否有一个更优雅的解决方案是通过一个带有“内连接”的sql查询来获取两个对象(理想的使用注释)?
答案 0 :(得分:0)
请注意,使用@Many
涉及Worker
类具有Collection<Bank>
属性。在您的情况下,您必须使用@One
。
@One
:映射到复杂类型的单个属性值。 属性:select,是映射的完全限定名称 可以加载实例的语句(即mapper方法) 适当的类型,
多个查询的潜在兴趣是lazyLoading
及时获得银行日期。
fetchType,取代全局配置参数 lazyLoadingEnabled用于此映射。
这实际上取决于你的要求。
如果仅限于按ID选择worker,则选择bank by id, 2个简单查询和单个查询之间没有太大区别 加入查询。
如果选择所有工人(比如100万),则选择100万 可以发行精选银行。如果懒惰,JOIN查询可能更好 加载不是一种选择。
无论如何,
注意您会注意到不支持通过连接映射 注释API。这是由于Java Annotations的限制 这不允许循环引用。
然后JOIN查询需要在XML中定义结果映射。使用自动映射,以下应该足够了:
<resultMap id ="workerResultMap" type="Worker">
<association property="bank" resultMap="bankResultMap"/>
</resultMap>
<resultMap id ="bankResultMap" type="Bank">
</resultMap>