我在Spring JPA中编写JPQL查询,并且遇到以下情况。我有一个实体Margin,其中包含PerPeriodMargin的列表,PerPeriodMargin的每个元素均包含MarginFactor的列表。 代码:
@Entity
public class Margin {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "margin", cascade = CascadeType.ALL, orphanRemoval = true)
private List<PerPeriodMargin> perPeriodMargins;
}
@Entity
public class PerPeriodMargin{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private Margin margin;
@OneToMany(mappedBy = "perPeriodMargin", cascade = CascadeType.ALL, orphanRemoval = true)
private List<MarginFactor> marginFactors;
}
@Entity
public class MarginFactor{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private Underlying underlying;
@ManyToOne
private PerPeriodMargin perPeriodMargin;
}
我想选择在单个jpql查询中将MarginFactor底层.id作为参数传递的所有保证金吗? 有什么建议吗?
我在application.properties“ logging.level.org.hibernate.SQL = DEBUG”中通过此行激活了休眠日志记录,我对生成的SQL查询感到困惑。多重联接似乎有问题。谁能解释这个。
从内边距m中选择*在内部连接per_period_margin上的ppm在m.id = ppm.margin_id上连接margin_factor在m.id上的mf.id = mf.per_period_margin_id其中mf.underlying_id =吗?和m.id =(从trading_account ta中选择margin_id,其中ta.id =吗?)
以及for perPeriodMargin
选择perperiodm0_.margin_id如margin_i5_12_0_,perperiodm0_.id如id1_12_0_,perperiodm0_.id如id1_12_1_,perperiodm0_.end_time如end_time2_12_1_,perperiodm0_.margin_id如margin_i5_12_1_,perperiodm0_.name如name3_12_1_,perperiodm0_.start_time如start_ti4_12_1_从per_period_margin perperiodm0_ 其中perperiodm0_.margin_id =?
直到现在一切都很好。
最后还有另外两个试图获取marginFactors的查询。
选择marginfact0_.per_period_margin_id作为per_peri6_9_0_,marginfact0_.id作为id1_9_0_,marginfact0_.id作为id1_9_1_,marginfact0_.bid作为bid2_9_1_定居点5_9_1_,marginfact0_.underlying_id为underlyi7_9_1_,底层1..id为id1_24_2_,底层1_。数字为数字2_24_2_,底层1_。显示为display3_24_2_,底层1_.enable_en__s_s_2_s_s_s_s_en_6_s,底层_1_.enable__2_2,底层1_.enable__2_en_1_。底层1_.focus_position为focus_po8_24_2_,底层1_.left_currency_id为left_cu11_24_2__,底层1_.name为名称9_24_2_,底层1_.right_currency_id为right_c12_24_2_,底层1_.temporary_disable为tempora10_24___s_3_s_s_en__3__ _curr_2_id_en_s_curr_1_。 Ë nable_sell作为enable_s4_3_3_,currency2_.name作为名称5_3_3_,currency2_.symbol作为symbol6_3_3_,currency2_.temporary_disable作为temporar7_3_3_,currency3_.id作为id1_3_4_3,_currencys_en_s_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3_3 name5_3_4_,currency3_.symbol作为symbol6_3_4_,currency3_.temporary_disable作为temporar7_3_4_ from margin_factor marginfact0_,marginfact0_上的左外部连接底层1。 right_currency_id = currency3_.id 其中marginfact0_.per_period_margin_id =?
,正如我们在上一个查询中看到的那样,只有perPeriodmarginId的where条件。我认为它还必须包含基础条件,因为此查询负责获取marginFactors,在这里我们必须提取具有特定底层ID的数据。
我对这个问题真的很认真,请有人可以解释一下,或者这是休眠中的错误!
答案 0 :(得分:0)
这是查询:
select m
FROM Margin m
JOIN m.perPeriodMargins ppm
JOIN ppm.marginFactors mf
JOIN mf.underlying und
WHERE und.id = :id