Как выбрать свойство из сущности в спящем отношении - PullRequest
1 голос
/ 14 января 2011

У меня есть класс сущностей, настроенный в Java, с отношением «многие ко многим» к другому классу. Однако вместо выбора всей коллекции сущностей я бы хотел выбрать только свойство из дочерних сущностей. Причина этого заключается в том, что это снизит объем данных, загружаемых в систему, поскольку мне не всегда нужен весь объект в зависимости от моего представления.

Это то, что я имею до сих пор:

@Entity
public class Disposition {
...
    @ManyToMany
    private List<Project> projects;
...
}

Это отлично работает и возвращает список экземпляров проекта. Однако я не хочу получать все проекты для диспозиции; Я хочу получить только Project.name.

Единственное решение, которое мне удалось найти, - это использование аннотации @Formula, но я бы хотел этого избежать, если это возможно, поскольку для этого требуется написание нативного SQL вместо HQL.

Это представление доступно только для чтения, поэтому я не ожидаю сохранения изменений в данных.

Ответы [ 4 ]

2 голосов
/ 14 января 2011

вы можете использовать hql , чтобы получить только имя ребенка. Это будет выглядеть примерно так:

"select p.name from Project p where p.parent_id = ?"

вам придется адаптировать имена переменных в них и использовать параметризованный запрос для замены? с идентификатором родителя.

Обычно именно такие ситуации настраиваются специально для таких ситуаций.

0 голосов
/ 09 марта 2012

Проверьте org.hibernate.criterion.Projection. Учитывая критерий, вы можете просто сделать следующее:

criteria.setProjection(Projections.property("name"));
0 голосов
/ 14 января 2011

Это , а не Hibernate, но проект ebean может вас заинтересовать.Ebean - это проект ORM, использующий аннотации JPA и допускающий отложенную (частичную) загрузку объектов.

В вашем примере получение только имен проектов приведет к следующему коду:

List<Project> projects = Ebean.find(Project.class)  
    .select("name") // Only name properties are loaded
    .where().eq("disposition", yourDisposition)  
    .findList(); 

Тогда, если вы попытаетесь получить владельца проекта (или любое другое свойство), эти свойства будут загружаться Ebean-ом.

0 голосов
/ 14 января 2011

Именно здесь объектное реляционное отображение больше не может вам помочь.Но вы можете использовать Query API, который позволяет запрашивать произвольные объекты с помощью HQL, а не SQL.Разве @Formula тоже не использует HQL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...