【问题标题】:SQL to JPQL, How to query Nested JPQLSQL 到 JPQL,如何查询嵌套的 JPQL
【发布时间】:2019-03-19 13:29:30
【问题描述】:

我想知道 JPQL 是否可以嵌套查询。我在学习Spring Data JPA,也上传了几个相关的问题。

如果我在 MySQL 中有以下 sql,我如何生成 JPQL:

select
    c.*
from
    cheat c
    left join (select * from cheat_vote where val = 1) v on c.cheat_seq = v.cheat_fk
group by
    c.cheat_seq
having
    count(*) < 10
limit 5

我有两个实体。

public class Cheat implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cheat_seq", length = 10)
    private Long cheatSeq;

    @Column(name = "question", unique = true, nullable = false)
    private String question;

    @Column(name = "answer", unique = true, nullable = false)
    private String answer;

    @Column(name = "writer_ip", nullable = false)
    private String writerIP;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "reg_date", nullable = false)
    private Date regDate;

    @Transient
    private String regDateText;

    @OneToMany(mappedBy = "cheat", fetch=FetchType.LAZY)
    private Set<CheatVote> vote;

    @Override
    public String toString() {
        return "Cheat [cheatSeq=" + cheatSeq + "]";
    }


}

Above 实体有一个@OneToMany 集合,集合实体在下面。

public class CheatVote implements Serializable{

    private static final long serialVersionUID = 1L;

    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Id
    @Column(name="seq", nullable=false)
    private Long seq;

    @Column(name="val", nullable=false)
    @NonNull
    private Integer value;

    @Column(name="ip_address", nullable=false)
    @NonNull
    private String ipAddress;

    @JoinColumn(name="cheat_fk", referencedColumnName="cheat_seq")
    @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @NonNull
    private Cheat cheat;

    @Override
    public String toString() {
        return "CheatVote [seq=" + seq + "]";
    }


}

我想要获得少于 10 个子 CheatVote 实体的 Cheat 实体。

【问题讨论】:

  • 你有没有尝试过?
  • 其实我不能......只是用谷歌搜索它。 “SELECT c FROM Cheat c JOIN (SELECT v FROM CheatVote v WHERE v.cheat = c ...)”没有意义!因为 SELECT c FROM Cheat c join c.something 是对的

标签: spring jpa jpql


【解决方案1】:

你可以试试:

@Query("SELECT c FROM Cheat c LEFT JOIN c.vote v WHERE v.value = 1 GROUP BY c.cheatSeq HAVING count(c) < 10")

关于'LIMIT'你可以使用Spring Data JPA的参数Pageable

【讨论】:

  • 执行我,还有一个问题...,我不完全理解 HAVING 子句。在这个 sql 中,这是否意味着有分组的行。一组少于 10 行?或者每个分组的行数应该小于 10?我认为这可能是第一个.. 对吗?
  • cheat_vote 表中的所有行都按 cheat_seq 分组。并且每组少于 10 行
  • 先生,答案可能是错误的......因为在我的问题中,在加入两个表之前应用了 WHERE 子句(其中 val= 1),否则,就像你的回答一样,我已经把在行动中,但是,WHERE caluse 在加入后应用......如果我不打扰你,你能解决那个答案..?
  • 其中两个返回相同的结果。你的查询比我的表现好。我使用这个查询是因为 spring data jpa 不支持加入子查询。也许你可以解决这个问题:@Query("SELECT c FROM Cheat c LEFT JOIN c.vote v ON v.value = 1 GROUP BY c.cheatSeq HAVING count(c)
猜你喜欢
  • 2021-07-16
  • 2017-09-27
  • 2019-04-18
  • 2017-10-29
  • 2014-10-26
  • 2013-09-17
  • 2011-07-05
  • 2018-10-29
  • 1970-01-01
相关资源
最近更新 更多