【问题标题】:JPA query compare listsJPA 查询比较列表
【发布时间】:2013-04-11 19:47:08
【问题描述】:

假设我有一个这样的实体:

public class Class1 {

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

在 JPA 中是否可以通过条件查询或命名查询来按列表比较实体?

类似于命名查询:

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

使用标准 api 的查询也可以正常工作。

【问题讨论】:

    标签: java jpa criteria-api


    【解决方案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);
    

    【讨论】:

    • 1.如果在 :other 周围添加括号,则会出现类型不匹配的情况,表明您正在尝试将 ArrayList 放入 OneRandomObject 中。 2. 如果没有括号,它可以工作,但是你会得到 c.list 中的任何元素与 other 中的任何元素匹配的一行。因此,如果您想确保列表中的所有元素都匹配,则不会这样做。
    【解决方案2】:

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

    也许您可以尝试根据您的条件获取所有 Class1 以及 the list,并过滤结果如下:

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

    【讨论】:

    • 是的,我也坚持这一点,我不想走遍历所有列表的道路,因为它会变得很糟糕,我只更改实体并将它们链接起来会更容易更紧密地结合在一起。这个问题让我更感兴趣,看看我如何处理 jpa 中的列表比较,因为它们是理论上的对象,我认为这很容易。我会等着看是否有人有更好的想法。在同时感谢您的回答。
    • 我想这将是要走的路。 CollectionUtils 有助于减轻一些收集痛苦。例如,我使用CollectionUtils.subtract(list, otherList).isEmpty() 来比较集合。
    猜你喜欢
    • 2015-10-27
    • 1970-01-01
    • 2016-04-05
    • 2020-11-23
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多