Хорошая структура объекта для результатов моего Left outer join в режиме гибернации
-
05-07-2019 - |
Вопрос
Мне нужно выполнить запрос внешнего соединения, который извлекает все определения и любые свойства, связанные с ними, которые связаны с определенной компанией.
У меня есть два объекта 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
Это должно решить проблемы, которые вы перечислили;это не идеально, но, вероятно, является лучшим решением, доступным в данных обстоятельствах.