我试图通过Projection使用一组来拉取所有映射实体,以返回映射对象的列表,因为有很多条目,但我只对有条目感兴趣。
public <T> List<T> queryWithGroupBy(Class<T> clazz, String property){
Criteria crit = getSession().createCriteria(clazz);
crit.setProjection(Projections.projectionList()
.add(Projections.groupProperty(property), property));
List<T> results = crit.list();
return results;
}
@Entity
@Table(name="MAPPED_MARK")
@AssociationOverrides({
@AssociationOverride(name="pk.docShell", joinColumns=@JoinColumn(name="DSHELL_ID")),
@AssociationOverride(name="pk.docBookmark", joinColumns=@JoinColumn(name="DMARK_ID"))
})
public class MappedDocBookmark implements Serializable{...}
服务方法
public List<MappedDocBookmark> listOfGroupByMappedBookmarks() {
List<MappedDocBookmark> list = dbDAO.queryWithGroupBy(MappedDocBookmark.class, "pk.docBookmark");
return list;
}
public List<DocBookmark> getListOfUnMappedBookmarks() {
List<DocBookmark> list = getListOfDocBookmarks();//get all listed
List<MappedDocBookmark> mappedDocBookmarks = listOfGroupByMappedBookmarks();//get mapped
for (MappedDocBookmark mapped : mappedDocBookmarks){//filter
if (list.contains(mapped.getDocBookmark())){
list.remove(mapped.getDocBookmark());
}
}
return list;
}
我在数据库中插入了测试记录,这里是我的测试:
第一个过去了,但不应该在我的脑海里。
@Test
public void loadGroupedMappedDocBookmarRecords(){
List<MappedDocBookmark> alist = docBookmarkService.listOfGroupByMappedBookmarks();
assertNotNull (alist);
assert (!alist.isEmpty() && alist.size()>0);
DocBookmark db = = docBookmarkService.getDocBookmarkById(1L);
assert (alist.get(0).equals(db) );
}
第二个没有传递并在(MappedDocBookmark mapped : mappedDocBookmarks){//filter
行获得ClassCastException。调试测试时,似乎返回了List<DocBookmark>
而不是List<MappedDocBookmark>
@Test
public void loadOrphanedDocBookmarRecords(){
List<DocBookmark> alist = docBookmarkService.getListOfUnMappedBookmarks();
assertNotNull (alist);
assert (!alist.isEmpty() && alist.size()>0);
DocBookmark db = null;
try {
db = docBookmarkService.getDocBookmarkById(1L);
} catch (EntityNotFoundException e) {
assert (false);
}
assert (!alist.contains(db) );
}
请提前告知并提前致谢!
答案 0 :(得分:0)
@ zeroflagL,你的评论让我思考要做什么,因为我误解了hibernate对群组投影和群组本身做了什么。我可以返回DocBookmark列表而不是MappedDocBookmark
。这是一个解决方案,但现在要知道List<Object>
是List<DocBookmark>
public <T> List<Object> queryWithGroupBy(Class<T> clazz, String property){
Criteria crit = getSession().createCriteria(clazz);
crit.setProjection(Projections.projectionList()
.add(Projections.groupProperty(property), property));
return crit.list();
}