巨大的建筑,总是由一木一石叠起来的,我们何妨做做这一木一石呢?我时常做些零碎事,就是为此。
这是对的,但是我没有说过这句话! —— 鲁迅
问题
列表查询中经常会关联多个表查询,会用到 left join、inner join 等来关联表。
但是假如两个表之间的关系是 1对多 的话,查询结果就会按 多 的那一方来。
而假如我们想要的查询结果是 1 那一方的话,用 mybaties等工具,可以生成 1 的对象,里面可能包含 多 方的一个list.
比如:
order表,订单表设计如下:
订单表waybill表,运单表设计如下:
运单表order和waybill的对应关系为1对多,即一个订单对应多个运单,waybill表中的orderid = 订单表中的id。
查询如下:
<resultMap id="hddOrderOut" type="com.enn.zhwl.tms.dal.entity.hdd.HddOrderOut">
<result column="id" property="id"/>
<result column="order_no" property="orderNo"/>
<collection property="waybills" ofType="com.enn.zhwl.tms.dal.entity.Waybill">
<result property="waybillNo" column="waybill_no" />
</collection>
</resultMap>
<select id="findHddOrders" resultMap="hddOrderOut" parameterType="java.util.Map">
SELECT
o.id,o.order_no,
w.waybill_no
FROM
`order` o
left join waybill w on w.order_id = o.id
where w.waybill_no like '%aa%'
</select>
比如有两个订单,每个订单都对应5个运单,那查出来,就是两个 HddOrderOut 对象.
但是假如加入分页的话,就有问题了,由于sql直接查出来的是10条数据,而不是两条数据,导致总数不一致,分页出现问题。
解决方法
直接查相应的order信息,然后再跟进order的id,去查询waybill的信息.
但是假如查询条件有waybill的信息怎么办,比如 where w.waybillno like '%aa%' , 那怎么办.
这时候就可以用exists,单单将查询条件加进去,,查询的结果,却只选择 1 这一方的数据。如下:
SELECT o.id,o.order_no
FROM
`order` o
where exists(
select 1 from waybill w where w.order_id = o.id and w.waybill_no like '%aa%'
)
然后再将查询到的Id,去对应查询相应的运单信息 waybill。
注意事项
用订单id,去查询运单的时候,也要将相应的之前的 查询条件带进去,如下:
SELECT * FROM
waybill w
where w.order_id = 123 and w.waybill_no like '%aa%'
原因是订单对应的5个运单中,可能只有3个满足需求.
网友评论