比方说,我有一个这样的实体:JPA查询比较列表
public class Class1 {
private long id;
...
private List<OneRandomObject> list;
}
是否有可能在JPA与条件查询或命名查询通过他们的名单比较实体?
类似命名查询:使用标准的API
select c from Class1 c where c.list=:list
查询将正常工作为好。
比方说,我有一个这样的实体:JPA查询比较列表
public class Class1 {
private long id;
...
private List<OneRandomObject> list;
}
是否有可能在JPA与条件查询或命名查询通过他们的名单比较实体?
类似命名查询:使用标准的API
select c from Class1 c where c.list=:list
查询将正常工作为好。
据我所知,不可能将整个集合过滤为属性。
也许你可以得到所有的Class1与the list
你的条件一起,并筛选如下结果:
for(Class1 c1 : class1List)
{
List<OneRandomObject> list = c1.getList();
// compare the list with you param
// remove if not match
}
我不知道这是否你的情况相符,但不会在做什么你要?
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.如果在括号中添加括号:other,则会出现类型不匹配,说明您试图将ArrayList放入OneRandomObject中。 2.如果没有括号,它会起作用,但你会得到一个与c.list中任何元素匹配的元素的行。所以如果你想确保列表中的所有元素都匹配,这是不行的。 – Dormouse
是的,我也这么想,我不想走遍所有列表的路径,因为它可以变得讨厌,对我来说,更改实体并将它们紧密连接在一起会更容易这个问题更让我感兴趣,看看我能如何处理jpa中的列表比较,因为它们是我非常容易理解的东西。我将等待看看是否有人有更好的想法。同时感谢你为你的答案。 – sokie
这将是我想要的方式。 'CollectionUtils'有助于缓解一些收藏痛苦。例如,我使用'CollectionUtils.subtract(list,otherList).isEmpty()'来比较集合。 – Dormouse