如何使用JPA限制左连接查询中的1项?

时间:2012-01-24 13:56:32

标签: 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 TableA tableA;

    @ManyToOne
    public User user;

    public String status;
}

用户根据AnObject实例获取TableA条目列表。如果TableA是新的,我想向用户显示。

(请注意,TableB的行为类似于User和TableA的n:n表,我无法将其集成到TableA中)

要说它是否是新的,它取决于TableB。为此,我有两个选择:

  • 在创建TableA时创建TableB,但状态为NEW或No
  • 或者没有为该用户创建TableB。如果该用户缺少该链接,则表示它是新的。 (这样做,我可以删除列状态)

(动作取决于“新”,它不仅仅是要展示的标签)。

现在,在我的JPA请求中,如何为该成员指示TableA条目是否为新的?

简单的方法是获取TableA列表,然后浏览List以检查其中是否有User(类似isUserInTableB(User user)的方法)

但是可以用JPA来实现,例如,List中只有一个项目,即User,如果没有链接,则为空;

(我希望我很清楚,这不是我的想法:/)

非常感谢你的帮助,我很感激!

1 个答案:

答案 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();
}