当前位置: 首页 > 知识库问答 >
问题:

Spring Boot中Hibernate/JPA中的投影,从多个OneToMany和manyToOne关系中提取数据

谭志用
2023-03-14

我需要创建一个JPA投影,该投影将从Entity1中提取所有记录,并包括一个从Entity4中提取的记录计数。

下面是映射的四个实体及其关系:

实体1(ManyToOne)实体2(OneToMany)实体3(OneToMany)实体4

在SQL中,这可以通过简单的内联select语句轻松地解决。在JPA投影中,我试图做到以下几点。

@Value("#{target.getEntity2().getEntity3().getEntity4().size()}")
String  getEntity4Count();  

在上面的代码中,投影在Entity1上。当我添加Entity4时,它会抛出异常。下面的代码起作用。

@Value("#{target.getEntity2().getEntity3().size()}")
String  getEntity3Count();

共有1个答案

丁阳羽
2023-03-14

Spring Data Projections并不是为这种映射而做的,因为它将获取实体,并在@value注释中作为SPEL(Spring Expression Language)代码执行您的“映射”。我想您更愿意使用更高效的SQL吧?

这是Blaze-Persistence实体视图的完美用例。

我创建这个库是为了允许JPA模型和自定义接口或抽象类定义的模型之间的简单映射,就像Steroids上的Spring数据投影一样。其思想是以您喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型。

@EntityView(Entity1.class)
public interface Entity1Dto {
    @IdMapping
    Long getId();
    @Mapping("COUNT(entity2.entity3.entity4)")
    Long getCount();
}

Spring数据集成允许您几乎像使用Spring数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_us/index.html#spring-data-features

 类似资料:
  • 问题内容: 我目前正在阅读有关实体关联的Hibernate文档,但遇到一些困难却难以理解。它在本质上做的区别和联系。尽管我在实际项目中使用了它们,但是我无法完全理解它们之间的差异。据我了解,如果一个表/一个实体与另一个实体有关联,则该关联应来自另一侧。那么,我们应该如何根据具体情况决定选择哪个呢?它又如何影响数据库/查询/结果?到处都有很好的例子吗? PS:我认为这与问题相关,如果有人可以解释关联

  • 但是如果可能的话,我想避免这种情况,因为它迫使我定义n个构造函数,为我在投影中想要的n个字段组合定义n个构造函数。

  • 问题内容: 我很难获得标准表达式的结果相关实体对象的列表。我有两个具有多对多关系的对象,例如ObjectA <-> ObjectB,其中ObjectA的单个实例可以绑定到ObjectB的多个实例,而ObjectB的实例可以绑定到ObjectA的多个实例。该关系存储在您的典型联接表中,但是由于遗留原因,对象模型是这样的,因此ObjectB无法直接知道其与ObjectA的关系。我正在尝试创建一个条件表

  • 作为条件表达式的结果,我很难获得相关实体对象的列表。我有两个具有多对多关系的对象 但是,这并不像预期的那样有效,因为投影API似乎只支持投影标量属性,而不支持投影实体对象。是否可以通过投影或其他标准API指定这种类型的选择?

  • 我有这两个实体: 所以一个组织可以有一个或多个OrganizationMeta,这是一个简单的情况。 有可能做到这一点吗?有人遇到过这个问题吗?

  • 问题内容: 我有一个具有单向一对多关系的类,如下所示: 通常,获取此订单的内容很简单: 但是无论出于何种原因,我都可能希望以某种方式过滤结果并仅以最快的方式检索部分商品集合,例如高于一定价格,低于一定库存的所有商品(不返回然后全部过滤)然后)。为此,我将运行HQL查询以检索特定订单的商品,并将更多内容添加到我的where子句或查询对象中。 凭直觉我会想要这种行为(这是完全错误的): 但是当然这是错