0

私は spring-boot を使用した JPA の新しいユーザーなので、この質問は非常に素朴に見えるかもしれません。私は2つの非常に単純なエンティティを持っています:

@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;
}

私が探している動作は、少なくとも 1 つのサービス パッケージを含むすべての RatePlan を、FetchAll() プリミティブを使用して SQL の単純な JOIN としてフェッチすることです。

Hibernate によって生成された SQL を出力すると、最初にすべての RatePlan がフェッチされ、次に各 RatePlan について関連する ServicePackage が検索されます。その結果、サービス パッケージが関連付けられていない料金プランが表示されます。これは望ましくありません。(選択外部結合を使用したかのように)。

サービス パッケージ クラスに ratePlan (ManyToOne) の参照を挿入すると、問題を解決できることがわかりました。しかし、ここでオブジェクトを複製する意味はありません。別の解決策はありますか?

ありがとう。

4

1 に答える 1

0

空のサービスパッケージを除外するには、これを行う必要があります。

Query query = session.createQuery("from RatePlan plan  fetch all properties where plan.servicePackages is not empty");
于 2015-03-05T12:57:00.797 に答える