一尘不染

Hibernate AliasToBean与集合

hibernate

我在父类和子类之间定义了双向的一对多关系。我正在寻找执行一个查询,以便我可以在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"
);

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

显然,我可以将其分为两个单独的查询,以便选择父级,然后选择所需的子级。但是感觉这应该是一个相当普遍的用例。也许我不是在以hibernate式的方式思考。


阅读 278

收藏
2020-06-20

共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行,但是避免了反射调用,因此可以安全地进行重构。

2020-06-20