2

DTOオブジェクトの次の構造があります。

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 = false、

MainDTO.root!= null、

MainDTO.root.disabled = false、

MainDTO.child.disabled = false、

MainDTO.child.info!= null、

MainDTO.child.info.disabled = false

これが私が書いたコードですが、InfoDTOからのselectinfoIdでスタックしました:

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"));

どうもありがとう!

4

1 に答える 1

0

まず第一に、エンティティをDTOと呼ぶことは本当に混乱します。

今あなたの質問に関しては、あなたはあなたの予測で定義したエイリアスを使うべきです

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

また、ルートと子への内部結合を実行している場合、最後の2つの制限は必要ありません。内部結合は、それらがnullでないことをすでに確認しています。

于 2011-10-10T16:27:09.063 に答える