繁体   English   中英

带收集的Hibernate AliasToBean

[英]Hibernate AliasToBean with Collection

我在父类和子类之间定义了双向一对多关系。 我正在寻求执行一个查询,以便我可以返回单个父项,并在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的集合中。 我得到的结果是一个对象列表,每个子节点有一个与年龄过滤器匹配的实例:

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

我也试图按父母分组,以便尝试将所有孩子聚合成一个集合,也无济于事。

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

只是不要使用任何变压器并自行编码循环:

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行,但避免了反射调用,因此允许安全重构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM