【发布时间】:2020-08-20 07:17:29
【问题描述】:
所以我们有一个简化了这两个实体的服务
@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() 访问票证。结果查询看起来很疯狂,我不确定这是否是一个聪明的方法。
【问题讨论】:
标签: java hibernate spring-boot jpql