Hibernate @OneToMany 的意外行为

Unexpected behavior with Hibernate @OneToMany

我是使用 spring-boot 的 JPA 新用户,所以这个问题可能显得非常幼稚。 我有两个非常简单的实体:

@Entity
@Table(name="RATEPLAN")
public class RatePlan implements Serializable {

@Id
@GeneratedValue
@Column(name="RPCODE")
private Long id;

@Column(name="DESCRIPTION",nullable = false)
private String name;


@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinTable(
        name="RPSP",
        joinColumns = @JoinColumn( name="RPCODE"),
        inverseJoinColumns = @JoinColumn( name="SPCODE")
)
private List<ServicePackage> servicePackages;

@Entity
@Table(name="SERVICEPACKAGE")
public class ServicePackage {

@Id
@GeneratedValue
@Column(name="SPCODE")
private long id;

public long getId() {
    return id;
}

我正在寻找的行为是,我想使用 FetchAll() 原语获取所有包含至少一个服务包的 RatePlan 作为 SQL 中的简单 JOIN。

当我打印由 Hibernate 生成的 SQL 时,首先它获取所有 RatePlan,然后为每个 RatePlan 查找关联的 ServicePackage。 结果是我提供的费率计划没有任何关联的服务包,这是我不想要的。 (好像我使用了 select 外连接)。

我看到在服务包 class 中插入 ratePlan (ManyToOne) 的引用可以解决问题。但我看不出在这里复制对象有任何意义。你有其他解决方案吗?

谢谢。

您需要执行此操作以过滤掉空的服务包。

Query query = session.createQuery("from RatePlan plan  fetch all properties where plan.servicePackages is not empty");