Hibernate Projection返回错误的对象类型列表?

时间:2014-11-13 22:57:56

标签: java hibernate spring-mvc junit

我试图通过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) );
    }

请提前告知并提前致谢!

1 个答案:

答案 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(); 
}