[英]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。 為此,我有兩個選擇:
(動作取決於“新”,而不僅僅是顯示的標簽)。
現在,在我的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.