【问题标题】:Finding an Entity based on a list of Entities根据实体列表查找实体
【发布时间】:2011-02-03 23:40:51
【问题描述】:

假设我们有 Group -> Member (ManyToMany)

对于给定的一组成员 - 找出是否为这些成员创建了组的最实用方法是什么? (没有额外或缺席的成员)

这感觉不对,因为 Group 似乎是由它的状态定义的,但是系统要求我们只为特定的成员组合(包括订单!)拥有一个 Group

编辑:

我正在寻找一种使用 JPA 来完成此任务的方法 - 所以 Set.retainAll 似乎并不适用。

我的意思是,这将是完美的:

List<Member> members;

... // members gets assigned

TypedQuery<Group> query = entityManager.createQuery("select g from Group g where g.members = ?", Group.class)

query.setParameter(1, members);

Group group = query.getSingleResult();

当然不是这样的。考虑最糟糕的实现

List<Group> groups = entityManager.createQuery("select g from Group g", Group.class).getResultList();

for (Group g: groups) {
    if (g.getMembers().equals(members)) {
        return g;
    }
}

这两者之间的某个地方必须是我缺少的东西。

【问题讨论】:

  • 到目前为止我想出的一个技巧是存储一个哈希,然后完全验证成员集合(以防止哈希冲突)。
  • 您是在寻找一种查找机制,还是希望阻止应用程序在多线程环境中创建具有相同成员的两个组?
  • 只是查找机制就可以了——这是处理一堆必须分组的项目列表的问题,但是如果我们处理一个已经被分组的项目列表,我们必须更新该组而不是创建一个新组。
  • 如果我让成员知道他们的组,那么我想我可以让每个成员,选择组,然后递归地将每个 List 相交到下一个,如果没有组是常见的,创建它,否则,验证组中的成员数与被测试的成员数相同(以防止更大的组匹配应被视为不同组的成员子集)。我将不得不针对 hash-hack 进行测试,看看哪个效果更好。

标签: java hibernate jpa domain-driven-design


【解决方案1】:

你可以试试Set.removeAll()Set.retainAll() 你的两组。

【讨论】:

  • 谢谢,但我的意思是来自 JPA 查询本身。我已经更新了我的问题,希望能更清楚。很抱歉造成混乱。
【解决方案2】:

正如我在评论中所说,使用哈希是我能找到的唯一方法,让我相信不可能通过一个集合来查询。

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 2018-09-03
    • 1970-01-01
    • 2016-06-21
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多