[英]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.