gpt4 book ai didi

java - hibernate/JPQL : How to load parent with all childs based on query on a child

转载 作者:行者123 更新时间:2023-12-01 16:54:28 25 4
gpt4 key购买 nike

所以我们有一个简化了这两个实体的服务

@Entity
public class Ticket {
/* simplified*/

@OneToMany(fetch = FetchType.LAZY, mappedBy = "ticket", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Grant> grants = new HashSet<>();
}

@Entity
public class Grant {
/* simplified*/

@NotNull
@ManyToOne(fetch = LAZY)
@JoinColumn(name = UsageGrant.FK_TICKET, nullable = false)
private Ticket ticket;

@NotNull
@Column(name = "specialNumber", nullable = false)
private Integer specialNumber;
}

我想要一个查询来选择包含具有特定“specialNumber”的赠款的所有票证。问题是我希望将票连同所有赠款一起退回,而不仅仅是匹配的赠款。我尝试过

@Repository
public interface TicketRepository extends JpaRepository<Ticket, String> {

@Query("SELECT DISTINCT ti FROM Ticket ti JOIN FETCH ti.grants g WHERE
g.specialNumber = :specialNumber "
)
List<Ticket> findBySpecialNumberAndLoadAllGrantsOnTicket(
@NotNull @Param("specialNumber") Integer specialNumber);
}

但这给了我匹配的一个。我需要将其分成两个查询吗? Criteria API 也没有帮助,因为那里也不支持 RIGHT JOIN。

更新

我可以实现它

SELECT g FROM Grant g LEFT JOIN FETCH g.ticket ti JOIN FETCH ti.grants WHERE g.specialNumber = :specialNumber

并使用 g.getTicket() 访问票证。结果查询看起来很疯狂,我不确定这是否是一个聪明的方法。

最佳答案

您可以使用@EntityGraph来获取grants并使用JPA方法进行查询以按specialNumber进行选择

@EntityGraph(attributePaths = {"grants"})
public List<Ticket> findByGrantsSpecialNumber(Integer specialNumber);

或者

您可以使用@NamedEntityGraph

@NamedEntityGraph(name = "Ticket.Grants", attributeNodes = { @NamedAttributeNode("grants") })
public class Ticket {

还有

@EntityGraph(value = "Ticket.Grants", type = EntityGraphType.LOAD)
public List<Ticket> findByGrantsSpecialNumber(Integer specialNumber);

关于java - hibernate/JPQL : How to load parent with all childs based on query on a child,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61616361/

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