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

JPA投影:只选择@OneTomany关系的部分项目和整个实体

薛浩言
2023-03-14

我有这两个实体:

@Entity
@Table(name = "ORGANIZATION")
public class Organization implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany(mappedBy = "organization", fetch = FetchType.LAZY)
    private Set<OrganizationMeta> metas;

    public Organization() {
        super();
    }

    public Organization(Long id, String name, Set<OrganizationMeta> metas) {
        super();
        this.id = id;
        this.name = name;
        this.metas = metas;
    }

    // ... others fields ... getters and setters
}

@Entity
@Table(name = "ORGANIZATION_META")
public class OrganizationMeta implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Enumerated(EnumType.STRING)
    @Column(name = "meta_key", length = 200, nullable = false)
    private OrganizationMetaKeyEnum metaKey;

    private String metaValue;

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(nullable = false)
    private Organization organization;

    // ... getters and setters ...
}

所以一个组织可以有一个或多个OrganizationMeta,这是一个简单的情况。

@Query("select new net.feed.feedentity.domain.organization.Organization(organization.id, organization.name, organization.metas) from Organization organization left join fetch organization.metas where organization.id = ?1")

有可能做到这一点吗?有人遇到过这个问题吗?

共有1个答案

司徒运锋
2023-03-14

我建议您通过使用Organization实体进行封闭投影技术来接收数据,因为您需要的只是Organization类的一个子集。

在这种情况下;您需要定义一个投影接口,它需要包含您感兴趣的属性的getter方法。那是你必须遵守的规则。名称应该匹配。

界面将如下所示:

public interface OrganizationView {
    String getId();
    String getName();
    Set<OrganizationMeta> getMetas();
}
public interface OrganizationRepository extends JpaRepository<Organization, Long> {

    @Query("select organization.id, organization.name, organization.metas from Organization organization left join fetch organization.metas where organization.id = ?1")
    List<OrganizationView> findSubsetById(Long id);
}

编辑:你可以看一看这个页面关于投影的解释与样本。

 类似资料:
  • 我需要创建一个JPA投影,该投影将从中提取所有记录,并包括一个从中提取的记录计数。 下面是映射的四个实体及其关系: (ManyToOne)(OneToMany)(OneToMany) 在SQL中,这可以通过简单的内联select语句轻松地解决。在JPA投影中,我试图做到以下几点。 在上面的代码中,投影在Entity1上。当我添加Entity4时,它会抛出异常。下面的代码起作用。

  • 我有两个词A,B。在这个词中A是父词,有下面的表结构。 A1-->Acolumn 甚至我也尝试过使用普通连接。PLS让我知道我错过了什么。 我使用@query来指定query。选择a From TableA a LEFT OUTER JOIN FETCH a.tableAcollection p,其中a.tableacolum=?1和p.tablebcolumn<>p.tablebcolumn。

  • 我有三个班,站点,GoupIP和IP 一个站点有一个或多个抱怨。GroupIP有一个或多个IP。 代码如下: 地点 群居 IP 在GroupIp课堂上,我得到: 在属性“ips”中,“映射者”值“groupip”无法解析为目标实体上的属性。 我的代码出了什么问题??

  • 使用Spring Data,JPA(4.0.8)和Hibernate(4.2.16)时,我遇到了一个问题,无法将分页传递到JPA OneToMany列表的子选择点击。在内部列表中,subselect选择要与main组合的所有元素,而不仅仅是给定页面的元素。 例如: 主要JPA实体: 当使用@fetchmode.subselect来限制SQL点击数时,有没有关于如何将分页传递到JPA实体中的任何列表

  • 我正在测试Spring Data 1.10.4.Release,遵循Spring Data Docs http://Docs.Spring.io/spring-data/jpa/Docs/current/reference/html/#Projections中的示例 问题1: 以下预测: 当我运行findPersonByFirstNameProjectedForLimitedData时 问题2:

  • 问题内容: 假设我有一个会议实体。每个会议都有一个与会者和一个会议日期。在我的会议表中,我可能会为每个与会者召开多个会议,每个会议的日期都不同。我需要一个JPA查询,该查询将仅为所有与会者选择最新的会议。例如,如果我的桌子看起来像这样 我的结果应该是 针对postgres使用JPA 2。会议有1-1个出席者和一个简单的时间戳记日期。我怀疑我需要和max(blah)做一个小组,也许还需要加入我自己的