【问题标题】:How to limit to 1 item on Left join query with JPA?如何使用 JPA 将左连接查询限制为 1 项?
【发布时间】:2012-01-24 13:56:32
【问题描述】:

这是我的用例:

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的列表,然后通过列表检查是否有User(类似isUserInTableB(User user)的方法)

但是是否可以使用 JPA 来做到这一点,例如,列表中只有一个项目,即用户,或者如果该用户未链接,则为空?

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

非常感谢您的帮助,非常感谢!

【问题讨论】:

    标签: jpa playframework jpql


    【解决方案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 集合,并在 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();
    }
    

    【讨论】:

    • 对于您的第一个查询,您的意思是 SELECT tableA ...(而不是 B)吗?
    • 不,这是一个查询,用于查找是否存在与 tableA 和用户匹配的 tableB。因此,如果没有,它会返回一个实例或 null。有了这个,如果这个方法返回null,你可以说tableA是新的
    • 哦!好,我知道了。有趣的。所以我可以选择访问数据库或测试每个条目 f tableBs 以了解它是否是新的。你会选择哪一个?
    • 这两个解决方案都是数据库。加载 tableA 时使用 tableBs 的 fetch join 的 isNew 方法是我的首选方法,因为它更好 OO 恕我直言
    猜你喜欢
    • 2021-09-26
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2013-11-02
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多