


















起因:
由于同事增加了一个对象关联。并且采用了Example查询,导致了一个Null的问题。
主表:BoBookingorder
关联表:BoJobcontainerinfo
@Entity @Table(name = "bo_bookingorder",catalog = "kintech_bo") public class BoBookingorder { private String bookingOrderUUID; private BoJobcontainerinfo boJobcontainerinfo=new BoJobcontainerinfo(); @Id public String getBookingOrderUUID() { return bookingOrderUUID; } @OneToOne @JoinColumn(name = "bookingOrderUUID", referencedColumnName = "orderUUID") public BoJobcontainerinfo getBoJobcontainerinfo() { return boJobcontainerinfo; } public void setBoJobcontainerinfo(BoJobcontainerinfo boJobcontainerinfo) { this.boJobcontainerinfo = boJobcontainerinfo; } }
生成的sql
// 生成了2段SQL select * from bo_bookingorder where BookingOrderNo=? and IsValid=1 order by CreateTime desc limit 1 ====================================================== select * from kintech_bo.bo_jobcontainer bobookingo0_ where bobookingo0_.orderUUID=?
PS:
很明显,自己写@Query注解sql (select * from xxx where .....),分成了2次查询,
这意味着,先查询了主表:BoBookingorder,然后填充了关联表:BoJobcontainerinfo
查询代码:还是根据bookingOrderNo 查询
BoBookingorder entity = new BoBookingorder(); entity.setBookingOrderNo(bookingOrderNo); Example<BoBookingorder> ex = Example.of(entity); BoBookingorder bo1 = bookingorderJpaService.findOne(ex);
生成的sql
select bo.* from kintech_bo.bo_bookingorder bo inner join kintech_bo.bo_jobcontainerinfo boc on bo .bookingOrderUUID=boc .OrderUUID where bo.BookingOrderNo=?
PS:
注意 inner join ,这个就是罪魁祸首。由于是inner join ,导致如果 jobcontainerinfo表没有数据,则bookingorder也返回null
调用Jpa自带的findOne,通过主键查询,看看是否会inner join 关联
代码:
BoBookingorder bo2=bookingorderJpaService.findOne("xxx");
生成的sql
select bo.* from kintech_bo.bo_bookingorder bo left outer join kintech_bo.bo_jobcontainerinfo boc on bo.bookingOrderUUID=boc.OrderUUID where bo.BookingOrderUUID=?
PS:
可以看到,JPA自带的findOne是left join,所以没有引发不适。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。