JPA查询比较列表

3

假设我有一个如下的实体:

public class Class1 {

private long id;
    ...
private List<OneRandomObject> list;
}

在JPA中,使用Criteria查询或Named查询是否可以比较实体的列表?

类似于以下的Named查询:

select c from Class1 c where c.list=:list

使用 Criteria API 进行查询同样有效。
2个回答

2

我不确定这是否符合您的情况,但这样做是否可以实现您想要的功能?

    public List<Class1> matchList(List<OneRandomObject> other) {
        // ...
        String jpql = "select c from Class1 c where c.list in (:other)"
        // ...
    }

我现在明白你的问题了。在Hibernate Criteria API中,可以这样实现:
    Criteria crit = session.createQuery(Class1.class);

    Conjunction junction = Restrictions.conjunction();

    for(OneRandomObject o: matches) {
        junction.add(Restrictions.propertyEq("list", o);
    }

    crit.add(junction);

1
  1. 如果在“:other”周围加上括号,你会得到一个类型不匹配的错误,说你试图把一个ArrayList放入OneRandomObject中。
  2. 没有括号它可以工作,但是你会得到一个行,其中包含c.list中任何元素与other中任何元素匹配的内容。因此,如果您想确保列表中的所有元素都匹配,则无法使用此方法。
- Dormouse

1
据我所知,不可能将整个集合作为一个属性进行过滤。
也许您可以根据您的条件获取所有Class1以及列表,并按以下方式过滤结果:
for(Class1 c1 : class1List)
{
    List<OneRandomObject> list = c1.getList();
    // compare the list with you param
    // remove if not match
}

是的,我也这样想,我不想通过迭代所有列表来解决问题,因为这可能会变得很棘手,更容易的方法是改变实体并将它们紧密地链接在一起。这个问题更多的是让我看看如何在JPA中处理列表比较,因为它们从理论上讲是对象,我认为这应该很容易。我会等待看看是否有更好的想法。同时感谢您的回答。 - sokie
这可能是一个不错的方法。CollectionUtils 可以帮助缓解一些集合操作的痛点。例如,我使用 CollectionUtils.subtract(list, otherList).isEmpty() 来比较集合。 - Dormouse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接