2011-10-10 142 views
2

我有DTO的下一个结构对象:休眠标准assotiated对象

public class MainDTO implements Serializable { 
    private Long mainId; 
    private String name; 
    ... //some other fields 
    private boolean disabled; 

    @ManyToOne() 
    @JoinColumn(name = "root_id") 
    private RootDTO root; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "child_id", updatable = false, referencedColumnName = "child_id") 
    @Cascade(value = { CascadeType.ALL, CascadeType.DELETE_ORPHAN }) 
    private ChildDTO child; 

    ... 
} 

public class RootDTO implements Serializable { 
    ... //some other fields 
    private boolean disabled; 

    ... 
} 


public class ChildDTO implements Serializable { 
    private Long childId; 
    ... //some other fields 
    private boolean disabled; 

    @ManyToOne() 
    @JoinColumn(name = "info_id") 
    private InfoDTO info; 

    ... 
} 

public class InfoDTO implements Serializable { 
    private Long infoId; 
    ... //some other fields 
    private boolean disabled; 

    ... 
} 

我需要填写Map<String, Map<Long, Long>><name from MainDTO, <mainId from MainDTO, infoId from InfoDTO >>)与下一个限制:

MainDTO.disabled =假,

MainDTO.root!= null,

MainDTO.root.disabled = false,

MainDTO.child.disabled =假,

MainDTO.child.info!= NULL,

MainDTO.child.info.disabled =假

这里是我写的代码,但从InfoDTO中选择infoId:

Criteria rootCriteria = getSession().createCriteria(
     MainDTO.class); 

// check that root is enabled 
rootCriteria.createCriteria("root", "root").add(
    Restrictions.eq("disabled", false)); 

// check that child is enabled 
Criteria childCriteria = rootCriteria 
    .createCriteria("child", "child") 
    .add(Restrictions.eq("disabled", false)) 
    .add(Restrictions.isNotNull("info")); 

// check that info is enabled 
childCriteria 
    .createCriteria("info", "info") 
    .add(Restrictions.eq("disabled", false)); 

ProjectionList rootProjection = Projections.projectionList() 
    .add(Projections.property("mainId")) 
    .add(Projections.property("name")) 
    .add(Projections.property("child.info")); //HOW TO SELECT ONLY ID?? 
rootCriteria.setProjection(rootProjection); 
rootCriteria.add(Restrictions.eq("disabled", false)) 
    .add(Restrictions.isNotNull("root")) 
    .add(Restrictions.isNotNull("child")); 

非常感谢!

回答

0

首先,调用实体DTO真的很让人困惑。

现在关于你的问题,你应该使用您在突起划分

ProjectionList rootProjection = 
    Projections.projectionList() 
       .add(Projections.property("mainId")) 
       .add(Projections.property("name")) 
       .add(Projections.property("info.infoId")); 

此外,考虑到你正在做一个内部联接到根目录和子目录的别名,最后两个限制是没有必要的:内部连接已经确保这些不是null。

+0

非常感谢!也许你可以帮我解决另一个问题:当我期望Object [3]将它转换为我的Map时,这个rootCriteria.list()返回下一个结构:Object [Object [3]]。也许我应该添加一些组声明? – ninja

+0

criteria.list()方法返回一个列表。列表中的每个元素都是由查询返回的行,用对象数组表示。每行有三列。 criteria.list()方法应该返回一个List ,每个Object []有3个元素。 –

+0

现在它返回列表,其中Object []包含它自己的Object [3]。 (在我的测试中)列表 result = rootCriteria.list();返回大小为31232的List ,并且每个List的Object [39224]都包含Object [3]。这意味着我得到了39224 * 31232对象[3] – ninja