2011-10-10 144 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