【问题标题】:How to do JPA join in one to many situations?JPA如何在一对多的情况下加入?
【发布时间】:2019-02-10 15:52:36
【问题描述】:

我有两个实体 Outlet 和 products 具有如下一对多关系-

@Entity
public class Outlet{

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
Long id;

@Fetch (FetchMode.SELECT)
@OneToMany(mappedBy = "outletProduct",fetch = FetchType.LAZY)
List<Product> products;

@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
Boolean isActive;

@ManyToOne
@JoinColumn(name = "outletId")
Outlet outletProduct;

现在我想要产品 isactive 为 true 的 Outlets。

我正在编写以下 JPQL 为-

 @Query("Select op From Outlet op  join op.products pro where pro.isActive=1  order by op.id")
 List<Outlet>  findAllByVarietiesPriceTimePeriodIn( );

但是我仍然在销售产品 isactive false。 请提出建议。

我想获得来自这个 sql 查询的结果-

SELECT * FROM outlet join product on product.outlet_id= outlet.id where product.is_active=1 ;

【问题讨论】:

  • 想发布真实的 JPQL?因为您发布的内容无效WHERE AND pro pro .isActive=1。完成后,发布您选择的 JPA 提供程序在数据库中执行的 SQL(在 JPA 提供程序日志中)
  • @BillyFrost 更新了 JPQL 请检查。
  • 查询将返回所有 Outlet,其中至少有一个 Product 的活动值为 1。这就是您所要求的
  • @BillyFrost 不,这不是我想要的,请检查更新后的问题的结果..我只想要那些有与其对应的有效产品的商店..
  • 正如我已经说过的,如果您不了解结果,请查看为任何 JPQL 查询执行的生成 SQL。您提议的 SQL 仍然可以返回 Outlet,其中有一个处于非活动状态的 Product(如果它也有一个处于活动状态的)。

标签: spring jpa spring-data-jpa jpql


【解决方案1】:

我想要至少有一个产品的 Outlet,但我不想要 isactive false 的产品。现在我正在获取列表中的所有产品

它是not recommended,但可以使用JOIN FETCH

Select op From Outlet op join fetch op.products pro where pro.isActive = 1 order by op.id

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 2019-04-27
    • 2021-10-19
    • 1970-01-01
    • 2022-07-26
    • 2019-11-06
    • 2018-04-11
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多