簡體   English   中英

左外連接與 Hibernate 5 核

[英]LEFT OUTER JOIN with Hibernate 5 Core

我有兩個實體(EntityA 和 EntityB),它們之間有一個可選的 @OneToOne 關系。

實體A:

@Setter
@Getter
@NoArgsConstructor
@Entity(name = "EntityA")
public class EntityA {

  @Id
  private Long id;

  @OneToOne(targetEntity = EntityB.class, mappedBy = "entityA", fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = true)
  private EntityB entityB;

  // other members
}

實體B:

@Setter
@Getter
@NoArgsConstructor
@Entity(name = "EntityB")
public class EntityB {

  @Id
  private Long id;

  @OneToOne(targetEntity = EntityA.class, fetch = FetchType.LAZY)
  @MapsId
  @JoinColumn(name = "id")
  private EntityA entityA;

  @Column(name = "status", nullable = false, unique = false)
  private Short status;

  // other members
}

我想 select 所有在實體 B 上沒有任何對應關系的實體 A,或者如果有,則 entityB 狀態應為 0。

從普通的 SQL 開始,我的目標是:

SELECT a.*
  FROM EntityA a
  LEFT JOIN EntityB b ON a.id = b.id
  WHERE b.id IS NULL OR b.status = 0

使用 Hibernate 5 核和 PostgreSQL 實現這一目標的最佳策略是什么?

我的方法是:

getSession().createQuery("SELECT a FROM EntityA a LEFT JOIN a.entityB b " +
                            "WHERE b IS NULL OR b.status = :status", EntityA.class)
                    .setParameter("status", (short) 0);

這是正確的方法嗎?

我如何渴望在同一個查詢中獲取 EntityB 實體?

謝謝。

您的查詢看起來正確。 此外,如果您想急切地獲取 EntityB,只需添加“FETCH”即可查詢

createQuery(
    "SELECT a FROM EntityA a " +
    "LEFT JOIN FETCH a.entityB b " +
    "WHERE b IS NULL " +
    "OR b.status = :status", EntityA.class).setParameter("status", (short) 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM