Хорошая структура объектов для результатов моего левого внешнего соединения Hibernate - PullRequest
1 голос
/ 11 сентября 2009

Мне нужно сделать запрос внешнего соединения, который извлекает все определения и любые свойства, которые они связали с ними, которые связаны с определенной компанией.

У меня есть два объекта моделей Hibernate:

class PropertyDefinition {
    @Id
    private Long id;

    @Column
    private String name;

    @OneToMany(mappedBy = "propertyDefinition")
    private Set<Property> properties = new HashSet<Property>();
}

class Property {
   @Id
   private Long id;

   @ManyToOne
   private Integer companyId;

   @ManyToOne
   private PropertyDefinition propertyDefinition;
}

Таким образом, запрос в итоге выглядит так:

from PropertyDefinition as pd left join pd.properties as props with props.companyId = :companyId

Так что пока все хорошо. Проблема в том, в какой структуре я храню возвращенные данные? Hibernate возвращает список, где [0] - это PropertyDefinition (никогда не должно быть нулевым), а [1] - возможно нулевым свойством.

Мои проблемы:

  • Это неприятно и не очень ОО-дружелюбно, чтобы обойти Список Объектов [] s.
  • Я не могу просто удерживать PropertyDefinition, потому что список свойств, которые он имеет, не ограничивается компанией.
  • Я мог бы создать простой объект, который содержит ссылку на PropertyDefinition и, возможно, нулевое свойство, но неэффективно выполнять итерацию по всему списку и помещать каждый в этот новый объект.

У кого-нибудь есть предложение для лучшего запроса или лучшей структуры отображения? Буду очень признателен за любую помощь.

1 Ответ

0 голосов
/ 11 сентября 2009

Ну, обычно левое соединение в коллекции лучше всего обрабатывать через fetch , который возвращает список объектов-контейнеров с заполненными коллекциями. Однако, поскольку вы используете условие with, это не сработает для вас.

Если вы хотите создать простой держатель для PropertyDefinition и Property с соответствующим открытым конструктором, вы можете указать Hibernate вернуть следующее:

select new Holder(pd, props)
  from PropertyDefinition as pd
  left join pd.properties as props
  with props.companyId = :companyId

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

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