【问题标题】:spring project result of query group by 2 columns查询按2列分组的spring项目结果
【发布时间】:2020-07-08 14:29:57
【问题描述】:

在 spring boot 中使用 spring data jpa 我有一种情况,使用 group by(2 列)的本地查询结果将是这样的:

a | 1
a | 2
a | 3
b | 4 
b | 6
...

第二列是另一个表的主键让我们说“A”,我的问题是: 我可以像这样将结果投影到新界面吗:

publice interface anInterface{
   String getColUmnA();
   List<A> getColumnB()
}

我首先拥有的对象包含第一个字符串并将第二个值聚合为由它获取的对象列表是 id。

【问题讨论】:

  • 你的两张表是什么关系?
  • 这是最终的原生查询结果

标签: spring-boot hibernate spring-data-jpa


【解决方案1】:

我不确定您到底在寻找什么。 “聚合”一词表明这是关于 SQL 聚合的,但您似乎只想对集合进行简单的投影。

AFAIK Spring Data Projections 不支持 JPQL/SQL 聚合或集合投影,因此您不能直接执行此操作。但是,这是 Blaze-Persistence Entity Views 的完美用例。

Blaze-Persistence 是基于 JPA 的查询构建器,它支持 JPA 模型之上的许多高级 DBMS 功能。我在它之上创建了实体视图,以允许在 JPA 模型和自定义接口定义模型之间轻松映射,例如 Spring Data Projections on steroids。这个想法是您以您喜欢的方式定义您的目标结构,并通过 JPQL 表达式将属性(getter)映射到实体模型。由于属性名称用作默认映射,因此您通常不需要显式映射,因为 80% 的用例是拥有作为实体模型子集的 DTO。

假设你有一个这样的实体模型

@Entity
public class A {
    @Id
    String id;
    List<B> bs;
}

@Entity
public class B {
    @Id
    Integer id;
}

带有实体视图的投影看起来像下面这样简单

@EntityView(A.class)
interface AProjection {
    @IdMapping
    String getId();
    List<BProjection> getBs();
}
@EntityView(B.class)
interface BProjection {
    Integer getId();
}

查询是将实体视图应用于查询的问题,最简单的就是通过 id 进行查询。

AProjection dto = entityViewManager.find(entityManager, AProjection.class, id);

但是 Spring Data 集成允许您几乎像 Spring Data Projections 一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

它只会获取您告诉它获取的映射

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 2019-02-22
    • 2022-01-23
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    相关资源
    最近更新 更多