один-ко-многим: заставляя Hibernate выбирать идентификатор ссылки, а не присоединять ее - PullRequest
0 голосов
/ 26 августа 2011

У меня есть два класса, хранящихся в моей базе данных с использованием Hibernate.Давайте назовем их Container и Item.Элемент имеет отношение «один ко многим» к контейнеру:

@entity(name = "containers")
public class Container {
    @Id
    @GeneratedValue
    private long id;
}

@entity(name = "items")
public class Item {
    @Id
    @GeneratedValue
    private long id;

    @ManyToOne
    @JoinColumn(name = "container_id")
    private Container container;
}

Я хочу выбрать «выбрать все» для всех элементов кортежа [ (long)item.id, (long)item.container_id ], но Hibernate, похоже, настаивает на получении [ (long)item.id, (Container)item.container ], представляя бесполезный(и дорого) присоединиться.

Я пробовал этот критерий запроса:

Criteria criteria = session.
    createCriteria(Link.class).
    add(Restrictions.isNotNull("container")).
    setProjection(Projections.projectionList().
        add(Projections.id()).
        add(Projections.property("container")));

Есть ли соответствующий критерий запроса.Должно быть возможно без запросов HQL или собственных запросов SQL, не так ли?

Редактировать 1: Рабочий запрос HQL:

session.createQuery("SELECT item.id, item.container.id " +
                    "FROM items AS item " +
                    "WHERE item.container <> NULL")

Редактировать 2: FetchType.LAZY не вариант.

Ответы [ 2 ]

2 голосов
/ 26 августа 2011
Criteria criteria = session.createCriteria(Link.class);
criteria.createAlias("container", "containerAlias");
criteria.add(Restrictions.isNotNull("containerAlias.id"));
criteria.setProjection(Projections.projectionList()
    .add(Projections.id())
    .add(Projections.property("containerAlias.id")));
1 голос
/ 26 августа 2011

Достаточно добавить атрибут fetch = FetchType.LAZY к аннотации @ManyToOne.Если вы аннотировали столбец ID в контейнере, проверка на то, имеет ли значение item.container ноль, не должна требовать объединения.

...