我正在尝试使用hibernate条件API订购查询。我的对象模型如下对象A具有对象B的一对多。 我正在尝试按照以下顺序进行分页
B.f1
A.field1
A.field2
因此,我创建条件的对象B中的映射是
@ManyToOne(fetch = FetchType.LAZY)
@Cascade({CascadeType.ALL})
@JoinColumn(name = "a_name", nullable = false)
public A getA() {
return this.a;
}
我为对象B创建了一个标准api
Criteria criteria = session.createCriteria(B.class);
然后我为这个critera添加一些限制,并为对象A创建一个Criteria,并按对象A的子句添加顺序。
//add some restrictions for object B
Criteria aCriteria = criteria.createCriteria("A");
//Criteria aCriteria = criteria.createAlias("A", "a");
processaFilters(aCriteria, filters);
aCriteria.addOrder(Order.asc("field1"));
aCriteria.addOrder(Order.asc("field2"));
然后我按对象B的条件添加订单
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setProjection(Projections.rowCount());
Long rowCount = (Long) criteria.uniqueResult();
criteria.setProjection(null);
criteria.setFirstResult(offset!=null ? offset : 0);
criteria.setMaxResults(maxResult!=null ? maxResult : 10);
criteria.addOrder(Order.asc("f1"));
List<B> bList = criteria.list();
然而,这并没有以正确的方式排序。我已经阅读了别名并尝试了但不确定如何实现它。我的条件查询没有任何问题,因为它工作正常,只有在我实现分页后才需要添加排序 有什么指针吗? 感谢
更新:
我尝试通过执行以下操作来创建别名:
criteria.createAlias("A", "c");
processClaimantFilters(criteria, filters);
并在方法中 processaFilters(aCriteria,过滤器);
我更改了所有属性以使用c例如
if (filters.getind() != null) {
aCriteria.add(Restrictions.eq("c.ind", filters.getInd()));
}
我删除了一些东西,只是为了查看它是否可行,但是当我打电话时
List<B> bList = criteria.list();
返回结果不是B类型的对象,而是包含对象A和B的Object []列表。所以我想我没有正确使用别名