【问题标题】:Unexpected behavior with Hibernate @OneToManyHibernate @OneToMany 的意外行为
【发布时间】:2015-03-05 10:46:59
【问题描述】:

我是使用 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。 结果是我提供了没有任何相关服务包的费率计划,这是我不想要的。 (好像我使用了选择外连接)。

我看到在 Service Package 类中插入 ratePlan (ManyToOne) 的引用可以解决问题。但我认为在这里复制对象没有任何意义。你有其他解决方案吗?

谢谢。

【问题讨论】:

    标签: spring hibernate jpa spring-boot hibernate-onetomany


    【解决方案1】:

    您需要这样做以过滤掉空的服务包。

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

    【讨论】:

    • 谢谢,我完全明白这个HQL的作用,但是我真的不知道在哪里使用它。
    • 终于找到了,非常好用谢谢@arunm
    猜你喜欢
    • 2012-07-18
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多