使用集合休眠 AliasToBean

Mic*_*ael 5 java hibernate hql

我在父类和子类之间定义了双向一对多关系。我希望执行一个查询,以便我可以在 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
}
Run Code Online (Sandbox Code Playgroud)

我希望实现的输出是:

public class ParentChildWrapper {
    private Parent parent;
    private Collection<Child> children; // subset of children
}
Run Code Online (Sandbox Code Playgroud)

我想过滤父母的 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"
);
Run Code Online (Sandbox Code Playgroud)

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

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

JB *_*zet 4

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

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);
Run Code Online (Sandbox Code Playgroud)

这使得 8 行简单代码而不是 1 行,但避免了反射调用,从而允许安全重构。