簡體   English   中英

如何在JPA的左聯接查詢中限制為1個項目?

[英]How to limit to 1 item on Left join query with JPA?

這是我的用例:

public class User extends Model {}

public class TableA extends Model {
    @OneToMany
    public List<TableB> tableBs;

    @ManyToOne
    public AnObject anObject;
}

public class TableB extends Model {
    @ManyToOne
    public TableA tableA;

    @ManyToOne
    public User user;

    public String status;
}

用戶將基於AnObject實例獲得TableA條目的列表。 我想向這個用戶展示TableA是否是新的。

(請注意,TableB的行為類似於User和TableA的:n表,我無法將其集成到TableA中)

要說它是否是新的,取決於TableB。 為此,我有兩個選擇:

  • 創建TableA時創建TableB,但狀態為NEW或No
  • 還是不為該用戶創建TableB。 如果該用戶缺少該鏈接,則表示它是新鏈接。 (這樣做,我可以刪除列狀態)

(動作取決於“新”,而不僅僅是顯示的標簽)。

現在,在我的JPA請求中,如何指示該成員的TableA條目是否為新成員?

最簡單的方法是獲取TableA的列表,然后遍歷該列表以檢查其中是否包含User(類似isUserInTableB(User user)

但是,是否可以使用JPA做到這一點,例如通過在列表中僅包含一個項目(即用戶),或者如果未鏈接此用戶則為空?

(我希望我很清楚,這不是我想的那么多:/)

非常感謝您的幫助,謝謝!

tableBs列表是一個屬性,而不是查詢的結果,因此您不能部分加載它。

使用一個查詢可以執行的操作是基於tableA實例和用戶實例檢索tableB實例。 就像是

public static TableB findByTableAAndUser(TableA, tableA, User user) {
    return find("select tableB from TableB tableB where tableB.tableA=? and tableB.user=?", tableA, user).first();
}

另一種方法是,如果要在tableA實例上使用“ isNew”方法,則是在加載tableA並在isNew方法中遍歷tableBs實例時獲取tableBs集合。 就像是

public boolean isNew(User user) {
    for (TableB tableB : tableBs) {
        if (tableB.user.equals(user)) {
            return true;
        }
    }
    return false;
}

您的findByIdWithTableBs方法可能是

public static TableA findByIdWithTableBs(Long id) {
    return find("select tableA from TableA tableA fetch join tableA.tableBs where tableA.id=?", id).first();
}

暫無
暫無

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

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