【问题标题】:Get some number of records by each type in one jpql query在一个 jpql 查询中按每种类型获取一些记录
【发布时间】:2017-07-24 15:38:45
【问题描述】:

我有两个实体——Person 和 Record:

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;

    @JsonIgnore
    @OneToMany(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Record> records;
}


@Entity
public class Record {
@Id
    @GeneratedValue
    private Long id;

@ManyToOne
    @JoinColumn(name = "person", referencedColumnName = "id", nullable = false)
    private Person person; 
}

我需要在一个查询中为每个现有人员获取 5 条记录。

我为 jpql 找到的唯一解决方案如下所示:

"SELECT r FROM Person p LEFT JOIN p.records r WHERE r.id IN " +
            "(SELECT r1.id FROM Record r1 WHERE r1.person = p AND " +
            "(SELECT Count(r2) FROM Record r2 WHERE r2.person = r1.person AND r2.id < r1.id) <= 5)

但在 spring jpa 中可能有更优雅的解决方案。

有人知道吗?

【问题讨论】:

  • 你在用什么DB
  • 如果您的数据库支持,您可以使用本机查询和分析函数相当轻松地做到这一点。
  • 数据库-mysql。而且我不能在这个项目中使用原生查询。

标签: spring jpa spring-data spring-data-jpa jpql


【解决方案1】:

您可以在 ToMany 一侧使用 javax.validation.constraints.Size 注释来限制 ma​​x 括号

//..ToMany and other annotations
@javax.validation.constraints.Size(min=0, max=5)
private List<Record> records;

【讨论】:

  • 不幸的是,这个选项不适合我的情况,因为它不够灵活,例如,如果我需要在查询中添加额外的条件
猜你喜欢
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多