这是我的用例:
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:n表,我无法将其集成到TableA中)
要说它是否是新的,它取决于TableB。为此,我有两个选择:
(动作取决于“新”,它不仅仅是要展示的标签)。
现在,在我的JPA请求中,如何为该成员指示TableA条目是否为新的?
简单的方法是获取TableA列表,然后浏览List以检查其中是否有User(类似isUserInTableB(User user)
的方法)
但是可以用JPA来实现,例如,List中只有一个项目,即User,如果没有链接,则为空;
(我希望我很清楚,这不是我的想法:/)
非常感谢你的帮助,我很感激!
答案 0 :(得分:1)
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时会获取tableBs集合,而juste在isNew方法中迭代通过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();
}