Hibernate与集合的AliasToBean
我在Parent和Child类之间定义了一个双向的一对多关系。 我期待执行一个查询,以便我可以返回一个父对象,以及它的一个子对象。
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,而是避免了反射调用,因此可以进行安全的重构。
链接地址: http://www.djcxy.com/p/37129.html