gpt4 book ai didi

java - 带连接的 JPA 标准构建器包装器

转载 作者:行者123 更新时间:2023-11-30 05:55:54 25 4
gpt4 key购买 nike

如何使用 JPA Criteria 构建器构建 DTO,并通过一对多关系链接表上的联接?

在文档中,没有同时使用包装器和连接案例的示例。

JPA Doc

例如:

EntityA {
String name;

@OneToMany
Set<EntityB> items;

...
}


Wrapper {
name;
Set<EntityB> items;
}

最佳答案

如果我没记错的话,你不能。投影不处理连接。也许您可能想要查询 EntityB 列表,而不是带有 itemsEntityA 列表,并将项目列表传递给采用父级的 Dto 对象实体及其列表。当然,这不是您想要的,但应该完成工作。因此,举例来说:

@Entity
public class EntityA {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

@OneToMany(mappedBy="a")
private Set<EntityB> bs;

@Entity
public class EntityB {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

@ManyToOne
private EntityA a;

public class WrapperDto {
private EntityA a;
private List<EntityB> bs;
public WrapperDto(EntityA a, List<EntityB> bs) {
this.a = a;
this.bs = bs;
}

并使用它:

    tx.begin();
EntityA a = new EntityA();
EntityB b1 = new EntityB();
EntityB b2 = new EntityB();
b1.setA(a);
b2.setA(a);
em.persist(a);
em.persist(b1);
em.persist(b2);
tx.commit();
em.clear();

// projection with join fetch doesn't work.
// em.createQuery("select new dto.WrapperDto( a, bs ) from EntityA a left outer join fetch a.bs bs where a.id = 1", WrapperDto.class).getResultList();

// a possible solution
EntityA aFound = em.find(EntityA.class, 1L);
List<EntityB> bs = em.createQuery("select b from EntityB b where b.a = :a", EntityB.class).setParameter("a", aFound).getResultList();
WrapperDto dto = new WrapperDto(aFound, bs);

关于java - 带连接的 JPA 标准构建器包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53201635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com