好的,所以我有以下(缩写)3 个实体和 HibernateUtil 类。
public class Tag {
@Id
BigDecimal id;
String tag
@ManyToMany( mappedBy="tags" )
List<Label> labels;
}
public class Label {
@Id
BigDecimal id;
String label;
@ManyToMany( targetEntity=Tag.class )
List<Tag> tags;
}
public class Data {
@Id
BigDecimal id;
BigDecimal data;
@ManyToOne
Label label;
}
public class HibernateUtil {
public static List pagedQuery(DetachedCriteria detachedCriteria, Integer start, Integer size) throws WebApplicationException {
Session session = getSession();
try {
Transaction transaction = session.beginTransaction();
List records = detachedCriteria.getExecutableCriteria(session)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.setFirstResult(start)
.setMaxResults(size)
.list();
transaction.commit();
return records;
} catch (Exception e) {
// Place Logger here...
throw new WebApplicationException(e);
} finally {
session.close();
}
}
}
我遇到的问题是,当我尝试使用 HibernateUtil.pagedQuery( detatchedCriteria, start, size ) 查询 Data 类时,我的结果列表与 size 参数不匹配。我发现原因是休眠构建查询以包含标签(Data.Label.Tags)的方式。
例如,当标签具有多个关联标签时,完整分页查询中使用的数据对象子查询的结果列表如下所示(我通过解析 Hibernate 向控制台吐出的 sql 发现了这一点)
- 数据 1;标签:标签 1
- 数据 1;标签;标签 2
- 数据 2;标签;标签 1
- 数据 2;标签;标签 2
- ETC...
如果我用 size=3 调用它,那么返回的结果集将是
- 数据 1;标签:标签 1
- 数据 1;标签;标签 2
- 数据 2;标签;标签 1
但是,Hibernate 会将前两行组合在一起(因为它们是相同的 Data 对象),并且我返回的 List 对象的大小为 2(Data-1 & Data-2)
我试图用我通过 Google 找到的 Projection 方法替换 setResultTransformer 方法,但它只返回了 Data 对象的 id。
有人对我有什么建议吗?我不知道从这里去哪里......