【问题标题】:Hibernate AliasToBean with Collection使用集合休眠 AliasToBean
【发布时间】:2011-09-09 14:25:13
【问题描述】:

我在父类和子类之间定义了一个双向的一对多关系。我正在寻找执行一个查询,以便我可以在一个 bean 中返回一个父节点及其子节点的子集。

public class Parent {
    private int id;
    private Set<Child> children = new HashSet<Child>(0);

    // other fields + getters and setters
}

public class Child {
    private Parent parent;
    private int age;

    // other fields + getters and setters
}

我希望实现的输出是:

public class ParentChildWrapper {
    private Parent parent;
    private Collection<Child> children; // subset of children
}

我想过滤父母的 id 和孩子的年龄列。为了获得所需的输出,我尝试了多种查询组合。

以下内容很接近,但没有将子项分组到我定义的 ParentChildWrapper bean 的集合中。我得到的结果是一个对象列表,每个孩子有 1 个与年龄过滤器匹配的实例:

Query q = session.createQuery(
    "SELECT p, c " +
    "FROM Parent p " +
    "INNER JOIN p.children c " +
    "WHERE p.id = :id " +
    "AND c.age = :age"
);

我也尝试按父级分组,以尝试将所有子级聚合到一个集合中,但也无济于事。

显然,我可以将其分成两个单独的查询以选择父级,然后选择我想要的子级。但感觉这应该是一个相当常见的用例。也许我不是在以一种休眠方式思考。

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    只是不要使用任何转换器并自己编写循环代码:

    List<Object[]> rows = query.list();
    Parent parent = null;
    List<Child> children = new ArrayList<Child>(rows.size());
    for (Object[] row : rows) {
        parent = (Parent) row[0];
        children.add((Child) row[1]);
    }
    ParentChildWrapper result = new ParentChildWrapper(parent, children);
    

    这使得 8 行琐碎的代码而不是 1 行,但避免了反射调用,因此允许安全重构。

    【讨论】:

    • 谢谢,我设法使用这种技术来获得我想要的输出。我希望 Hibernate 有办法为我做这件事,否则我会到处都有这样的循环。
    • 我对类似的东西很感兴趣,我想问你这个解决方案:我们会将持久对象封装在另一个非持久对象(ParentChildWrapper) 中。这不会是一个问题或不推荐的事情吗?
    • 不,我不明白为什么会这样。
    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2018-03-01
    • 2016-11-15
    • 2011-06-17
    • 2011-02-03
    相关资源
    最近更新 更多