Хорошая структура объекта для результатов моего Left outer join в режиме гибернации

StackOverflow https://stackoverflow.com/questions/1407862

Вопрос

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

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

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] - это определение свойства (никогда не должно быть нулевым), а [1] - возможно, нулевое свойство.

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

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

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

Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top