Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JPA将左侧连接查询限制为1项?_Jpa_Playframework_Jpql - Fatal编程技术网

如何使用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。如果该用户缺少该链接,则表示该链接是新的。(这样做,我可以删除列状态)
(行动取决于“新”,而不仅仅是一个标签)

现在,在我的JPA请求中,我如何表明对于该成员,TableA条目是否是新的

简单的方法是获取表a的列表,然后检查列表中是否有用户(类似于
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更好