Критерии гибернации и столбец подсчета

Я пытаюсь вернуть объект со столбцом, в котором есть количество другой таблицы, которая является отношением один ко многим. Я хочу сделать это, используя критерии гибернации, а не HQL.

select p.*, (select count(*) from child where child.parentid = p.id) as LEVELS
from parent p

person Mike Flynn    schedule 19.02.2011    source источник
comment
Ваше предложение where должно быть from?   -  person    schedule 19.02.2011
comment
Спасибо, исправил эту синтаксическую ошибку   -  person Mike Flynn    schedule 19.02.2011


Ответы (4)


Если родительский объект также содержит список дочерних элементов (двунаправленная ассоциация), вы можете использовать критерии для возврата количества дочерних элементов следующим образом:

    Criteria criteria = hibernateSessionHelper.getSessionFactory().getCurrentSession().createCriteria(Parent.class);

    ProjectionList projList = Projections.projectionList();
    projList.add(Projections.countDistinct("children.id"));
    projList.add(Property.forName("field1").group());
    projList.add(Property.forName("field2").group());
    projList.add(Property.forName("field3").group());
    .
    .
    .
    criteria.createAlias("children", "children", CriteriaSpecification.LEFT_JOIN);

    criteria.setProjection(projList);

    List<Object[]> results = crit.list();
person EkcenierK    schedule 12.08.2011

Получил это, чтобы работать, делая это. Не очень динамично, но пойдет.

    @Basic
    @Column(name = "LEVEL")
    @Formula(value="(SELECT count(*) FROM BadgeLevels bl WHERE bl.badgeid = this_.id)")
        public long getLevel() {
        return level;
    }
person Mike Flynn    schedule 19.02.2011

Определите отображение поля объекта, как показано ниже. Затем, когда вы запрашиваете свои родительские объекты, каждый объект должен иметь поле списка типов, называемое дочерними элементами, для которого вы можете вызвать size.

<class name="Person">
    <id name="id" column="id">
        <generator class="native"/>
    </id>
    <set name="children">
        <key column="parentId" 
            not-null="true"/>
        <one-to-many class="Child"/>
    </set>
</class>

<class name="Child">
    <id name="id" column="childId">
        <generator class="native"/>
    </id>
</class>
person Community    schedule 19.02.2011
comment
Я возвращаю список родителей, и я не хочу возвращать все дочерние элементы соединения этого объекта. Я просто хочу подсчитать дочерние элементы с родительскими столбцами. - person Mike Flynn; 19.02.2011

Возможно, вы сможете сделать это с помощью какой-то проекции.

См. руководство по Hibernate. проекции. Вы, вероятно, заинтересованы в методе sqlProjection в Projections. класс для подзапроса.

List results = session.createCriteria(Parent.class, "p") 
    .setProjection(Projections.projectionList()
        .add(Projections.property("field1"))
        .add(Projections.property("field2"))
        .add(Projections.property("field3"))
        .add(Projections.sqlProjection("select count(*) from child where child.parentid = p.id"), new String[] {"LEVELS"}, new Type[] {Hibernate.INTEGER})
    ).list();
person Community    schedule 19.02.2011
comment
Я собираюсь попробовать это, но в любом случае не использовать необработанный sql и как-то использовать отдельный запрос? - person Mike Flynn; 19.02.2011
comment
Сложность заключается в том, что ваш count зависит от другого отношения. Если вы используете сопоставления Hibernate Association, затем вы можете отобразить список дочерних объектов и просто использовать метод Java size. - person ; 19.02.2011
comment
Смотрите мой другой ответ для метода ассоциаций. - person ; 19.02.2011
comment
Этот оригинальный проект дал мне select * from ( select select count(*) from badgelevels bl where bl.badgeid = b.id from CISCO.BADGES this_ where this_.ACTIVE=? ) where rownum ‹= ? - person Mike Flynn; 19.02.2011
comment
Как я могу вернуть остальные столбцы из Parent.class со счетом? Я пропустил проекцию? - person Mike Flynn; 19.02.2011
comment
Вы можете добавить дополнительные столбцы, объединив вызовы в projectionList. Я изменил свой первоначальный ответ для этого. - person ; 20.02.2011
comment
Да, но как это сделать за один вызов, потому что я могу добавить больше свойств в будущем и не хочу вводить 20 столбцов, чтобы вернуть их. - person Mike Flynn; 20.02.2011