2013-04-18 79 views
3

比方说,我有一个这样的实体:JPA查询比较列表

public class Class1 { 

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

是否有可能在JPA与条件查询或命名查询通过他们的名单比较实体?

类似命名查询:使用标准的API

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

查询将正常工作为好。

回答

1

据我所知,不可能将整个集合过滤为属性。

也许你可以得到所有的Class1与the list你的条件一起,并筛选如下结果:

for(Class1 c1 : class1List) 
{ 
    List<OneRandomObject> list = c1.getList(); 
    // compare the list with you param 
    // remove if not match 
} 
+0

是的,我也这么想,我不想走遍所有列表的路径,因为它可以变得讨厌,对我来说,更改实体并将它们紧密连接在一起会更容易这个问题更让我感兴趣,看看我能如何处理jpa中的列表比较,因为它们是我非常容易理解的东西。我将等待看看是否有人有更好的想法。同时感谢你为你的答案。 – sokie

+0

这将是我想要的方式。 'CollectionUtils'有助于缓解一些收藏痛苦。例如,我使用'CollectionUtils.subtract(list,otherList).isEmpty()'来比较集合。 – Dormouse

1

我不知道这是否你的情况相符,但不会在做什么你要?

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); 
+0

1.如果在括号中添加括号:other,则会出现类型不匹配,说明您试图将ArrayList放入OneRandomObject中。 2.如果没有括号,它会起作用,但你会得到一个与c.list中任何元素匹配的元素的行。所以如果你想确保列表中的所有元素都匹配,这是不行的。 – Dormouse