Критерии гибернации для ассоциированных объектов - PullRequest
2 голосов
/ 10 октября 2011

У меня есть следующая структура объектов 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

Вот код, который я написал, но застрял в выбранном infoId из InfoDTO:

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

Большое спасибо!

1 Ответ

0 голосов
/ 10 октября 2011

Прежде всего, вызов сущностей DTO действительно сбивает с толку.

Теперь, касаясь вашего вопроса, вы должны использовать псевдонимы, которые вы определили в своих проекциях

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

Кроме того, учитывая, что вы 'При внутреннем соединении с root и child последние два ограничения не нужны: внутренние объединения уже проверяют, что они не равны NULL.

...