我在父类和子类之间定义了双向的一对多关系。我正在寻找执行一个查询,以便我可以在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式的方式思考。
只是不要使用任何转换器,而是自己编写循环代码:
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行,但是避免了反射调用,因此可以安全地进行重构。