如何使用JPA将左侧连接查询限制为1项?
以下是我的用例:如何使用JPA将左侧连接查询限制为1项?,jpa,playframework,jpql,Jpa,Playframework,Jpql,以下是我的用例: 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 Tabl
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;
}
公共类用户扩展模型{}
公共类表扩展模型{
@独身癖
公共列表表;
@许多酮
公共对象;
}
公共类TableB扩展模型{
@许多酮
公共表格;
@许多酮
公共用户;
公共字符串状态;
}
用户根据一个对象的实例获取一个TableA条目列表。我想向这个用户展示TableA是否是新的
(注意,TableB对于用户和TableA来说就像一个n:n表,我无法将其集成到TableA中)
如果是新的,则取决于表B。为此,我有两个选择:
- 在创建TableA时创建TableB,但状态为NEW或No
- 或者不为该用户创建TableB。如果该用户缺少该链接,则表示该链接是新的。(这样做,我可以删除列状态)
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时获取tableBs集合,然后在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();
}
对于您的第一个查询,您是指
选择tableA…
(而不是B)?否,这是一个查找是否存在与tableA和user匹配的tableB的查询。因此,它返回一个实例,如果没有,则返回null。有了这个,如果这个方法返回nullOh,就可以说tableA是新的!好的,我知道了。有趣。因此,我可以选择是访问数据库,还是测试表格中的每个条目,以确定它是否是新的。您会选择哪一种?两种解决方案都是数据库。在加载tableA时使用fetch连接TableB的isNew方法是我的首选方法,因为它比OO IMHO更好