大家好我有这个代码:
Criteria criteria = session.createCriteria(Department.class);
ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("id"), "id");
properties.add(Projections.property("name"), "name");
properties.add(Projections.property("children"), "children");
criteria.setProjection(properties);
criteria.setFetchMode("children", FetchMode.JOIN);
criteria.setResultTransformer(Transformers.aliasToBean(Department.class));
criteria.add(Restrictions.isNull("parent.id"));
criteria.add(Restrictions.eq("active", true));
return criteria.list();
Run Code Online (Sandbox Code Playgroud)
和实体类
public class Department extends Model {
@Size(max = 200)
private String name;
@Size(max = 10)
private String sg;
@Size(max = 1000)
private String description;
@ManyToOne
@JoinColumn(name = "id_parent")
private Department parent;
private boolean active;
@OneToMany(mappedBy = "parent")
private List<Department> children;
Run Code Online (Sandbox Code Playgroud)
......加上吸气剂和二传手......
我执行标准并给我stacktrace异常:
java.lang.ArrayIndexOutOfBoundsException: 2
at org.hibernate.loader.criteria.CriteriaLoader.getResultRow(CriteriaLoader.java:166)
at org.hibernate.loader.criteria.CriteriaLoader.getResultColumnOrRow(CriteriaLoader.java:146)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:747)
at org.hibernate.loader.Loader.processResultSet(Loader.java:949)
at org.hibernate.loader.Loader.doQuery(Loader.java:917)
at
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
提前致谢.
如果不知道您要尝试对投影查询执行什么操作,则很难说如何修复它。我认为您的主要问题是您需要为孩子创建一个别名,然后在投影中使用该别名。在您的投影中,您还需要引用子项的属性。你可以这样做:
Criteria criteria = session.createCriteria(Department.class);
ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("id"), "id");
properties.add(Projections.property("name"), "name");
properties.add(Projections.property("children.id"), "id");
properties.add(Projections.property("children.name"), "name");
criteria.setProjection(properties);
criteria.createAlias("children", "children", JoinType.FULL_JOIN);
criteria.setResultTransformer(Transformers.aliasToBean(Department.class));
criteria.add(Restrictions.isNull("parent.id"));
criteria.add(Restrictions.eq("active", true));
return criteria.list();
Run Code Online (Sandbox Code Playgroud)
也就是说,我认为如果您的目的是返回根部门及其子部门树的列表,那么在这里使用投影是一个错误并且不必要。为此,你可以这样做:
Criteria criteria = session.createCriteria(Department.class);
criteria.createAlias("children", "children", JoinType.FULL_JOIN);
criteria.add(Restrictions.isNull("parent.id"));
criteria.add(Restrictions.eq("active", true));
retun criteria.list();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4579 次 |
| 最近记录: |