惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
博客园 - 聂微东
小众软件
小众软件
P
Proofpoint News Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
TaoSecurity Blog
TaoSecurity Blog
博客园 - 司徒正美
罗磊的独立博客
N
News and Events Feed by Topic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security Affairs
S
Security @ Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
月光博客
月光博客
S
Secure Thoughts
P
Proofpoint News Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Forbes - Security
Forbes - Security
H
Heimdal Security Blog
W
WeLiveSecurity
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
L
LangChain Blog
T
The Blog of Author Tim Ferriss
NISL@THU
NISL@THU
Google DeepMind News
Google DeepMind News
Cloudbric
Cloudbric
H
Hacker News: Front Page
The Last Watchdog
The Last Watchdog
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
Cisco Blogs
博客园 - 三生石上(FineUI控件)
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Schneier on Security
Project Zero
Project Zero
SecWiki News
SecWiki News
爱范儿
爱范儿
The Register - Security
The Register - Security
AI
AI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Y
Y Combinator Blog
L
Lohrmann on Cybersecurity
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Privacy International News Feed
J
Java Code Geeks
S
Securelist
C
Cyber Attacks, Cyber Crime and Cyber Security
V
Visual Studio Blog

博客园 - 正怒月神

windows 安装 openclaw docker-compose 启动 elk linux mysql 备份 maven 打包时优先选择本地仓库 nginx 部署2个相同的vue minio 设置IP MapStruct-plus cannot find converter from jenkins pipeline 发布 jar并运行 MapperStruct 嵌套模型中 List<> 转 List<String> Easy es问题总结 Logstash docker发布 Docker 无法拉取 springmvc 多事务提交和回滚 springMvc 配置 UReport2 java 通过 microsoft graph 调用outlook(三) jackson.dataformat.xml 反序列化 对象中包含泛型 OR-TOOL 背包算法 解决JIRA、Confluence自动注销登录的问题 java 通过 microsoft graph 调用outlook(二)
JPA Example 默认 join
正怒月神 · 2024-04-24 · via 博客园 - 正怒月神

起因:

由于同事增加了一个对象关联。并且采用了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生成

1 根据bookingOrderNo(非主键)查询

生成的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

2 Example查询

查询代码:还是根据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

3 常规findOne 

调用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,所以没有引发不适。

三  结论:慎用Example来做查询条件。