Критерии гибернации и счетная колонка - PullRequest
8 голосов
/ 19 февраля 2011

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

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

Ответы [ 4 ]

5 голосов
/ 12 августа 2011

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

    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();
1 голос
/ 20 февраля 2011

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

    @Basic
    @Column(name = "LEVEL")
    @Formula(value="(SELECT count(*) FROM BadgeLevels bl WHERE bl.badgeid = this_.id)")
        public long getLevel() {
        return level;
    }
0 голосов
/ 19 февраля 2011

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

<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>
0 голосов
/ 19 февраля 2011

Вы могли бы сделать это с помощью какой-то проекции.

См. Учебник по проекциям Hibernate. Вероятно, вас заинтересовал метод sqlProjection в классе Projection для подзапроса.

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();
...