微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将复杂的SQL查询转换为JPQL?

如何解决如何将复杂的SQL查询转换为JPQL?

我在sql中有以下查询

发件人文档表包含发件人和文档实体。

@Entity
@Table(name = "sender_document")
public class SenderDocument  {

    @Id
    @Column(columnDeFinition = "uuid")
    protected UUID id;

    @Column(name = "created_at")
    private LocalDateTime createdAt;

    @ManyToOne
    @JoinColumn(name = "sender_id")
    private Sender sender;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "document_id")
    private Document document;
    
    //other columns

}

我必须找到所有有效期在开始和结束之间的发件人的最新文档。

select * from sender_document join
(select sender_id,max(created_at) as maxDate
from sender_document
group by sender_id ) as t2
on created_at = t2.maxDate
and t2.sender_id = sender_document.sender_id
where sender_document.document.expiry_date between 'start_date' and 'end_date'

我必须将其转换为JPQL或使用标准API。我正在使用Postgres数据库

如何将其转换为单个JPQL?

解决方法

我只是意识到用JPQL编写复杂的查询有多么困难。

我遇到了类似下面的解决方案。

SELECT sd FROM SenderDocument sd 
where sd.createdAt = (SELECT MAX(s.createdAt) FROM SenderDocument  s 
where s.sender = sd.sender and s.document.type in :types 
and sd.document.type in :types) 
and (:mtoId is null or sd.sender.mtoId = :mtoId) and sd.document.expiryDate 
between :start and :end order by sd.createdAt asc

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。