【发布时间】:2018-12-28 15:31:36
【问题描述】:
我正在 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 based.id 的所有 Margin? 有什么建议吗?
我通过 application.properties "logging.level.org.hibernate.SQL=DEBUG" 中的这一行激活了休眠日志记录,我对生成的 SQL 查询感到困惑。多重连接似乎有问题。谁能解释一下。
select * from margin m inner join per_period_margin ppm on m.id = ppm.margin_id join margin_factor mf on ppm.id = mf.per_period_margin_id where mf.underlying_id = ?和 m.id = (select margin_id from trading_account ta where ta.id = ?)
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_ where 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_,marginfact0_.notional 作为 notional3_9_1_,marginfact0_.offer 作为 offer4_9_1_,marginfact0_.per_period_margin_1_id 作为 per.peritt6 settleme5_9_1_,marginfact0_.underlying_id如underlyi7_9_1_,underlying1_.id如id1_24_2_,underlying1_.digits如digits2_24_2_,underlying1_.display如display3_24_2_,underlying1_.enable如enable4_24_2_,underlying1_.enable_buy如enable_b5_24_2_,underlying1_.enable_sell如enable_s6_24_2_,underlying1_.focus_digits如focus_di7_24_2_, underlying1_.focus_position如focus_po8_24_2_,underlying1_.left_currency_id如left_cu11_24_2_,underlying1_.name如name9_24_2_,underlying1_.right_currency_id如right_c12_24_2_,underlying1_.temporary_disable如tempora10_24_2_,currency2_.id如id1_3_3_,currency2_.digits如digits2_3_3_,currency2_.enable_buy如enable_b3_3_3_,currency2_。 e nable_sell 作为 enable_s4_3_3_,currency2_.name 作为 name5_3_3_,currency2_.symbol 作为 symbol6_3_3_,currency2_.temporary_disable 作为 temporar7_3_3_,currency3_.id 作为 id1_3_4_,currency3_.digits 作为digits2_3_4_,currency3_.enable_buy 作为 enable_b3_3_4_,currency3_.enable_sell 作为启用。 name5_3_4_, currency3_.symbol as symbol6_3_4_, currency3_.temporary_disable as temporar7_3_4_ from margin_factor marginfact0_ left outer join 底层基础 1_ on marginfact0_.underlying_id=underlying1_.id 左外连接货币 currency2_ 在基础 1_.left_currency_id=currency2_.id 左外连接货币 currency3_ 在基础 1_。 right_currency_id=currency3_.id marginfact0_.per_period_margin_id=?
正如我们在最后一个查询中看到的,perPeriodmarginId 上只有一个 where 条件。因为我认为它还必须包含基础条件,因为此查询负责获取 marginFactors,我们必须在其中提取具有特定基础 ID 的数据。
我对这个问题很认真,请有人解释一下还是休眠中的错误!
【问题讨论】:
-
到目前为止您尝试过什么?请将您的代码添加到问题中
-
请查看我对这个问题的最新更新。
-
使用原生查询,ORM不适用于这种复杂的关系查询。您需要非常小心 JPQL 生成的 SQL。
-
我发现了这篇文章 [stackoverflow.com/questions/47996810/…,这与我的情况不太相似,但我想问我们是否可以在这里做类似的事情
-
这是?:
select m FROM Margin m JOIN m.perPeriodMargins ppm JOIN ppm.marginFactors mf JOIN mf.underlying und WHERE und.id = :idUnderlying
标签: mysql spring hibernate spring-data-jpa jpql