Hibernateの左外部結合の結果に適したオブジェクト構造
-
05-07-2019 - |
質問
すべての定義と、特定の会社に関連付けられている定義が関連付けられているすべてのプロパティを取得する外部結合クエリを作成する必要があります。
2つの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(決してnullであってはならない)、[1]がnullの可能性があるプロパティであるリストを返します。
私の問題:
- Object [] sのリストを渡すのは不快で、オブジェクト指向にはあまり適していません。
- PropertyDefinitionを保持することはできません。保持するプロパティのリストは会社に限定されないからです。
- PropertyDefinitionへの参照とnullの可能性のあるプロパティを保持する単純なオブジェクトを作成できますが、リスト全体を反復処理し、それぞれをこの新しいオブジェクトに配置するのは非効率的です。
クエリやマッピング構造を改善する提案はありますか?ご協力いただければ幸いです。
解決
まあ、通常はコレクションの左結合は fetch は、データが入力されたコレクションを持つコンテナオブジェクトのリストを返します。ただし、 with
条件を使用しているため、これは機能しません。
適切なパブリックコンストラクターで PropertyDefinition
および Property
の単純なホルダーを作成する場合、Hibernateにそれを返すように指示できます:
select new Holder(pd, props)
from PropertyDefinition as pd
left join pd.properties as props
with props.companyId = :companyId
リストにある問題を処理する必要があります。理想的ではありませんが、おそらくその状況下で利用可能な最良のソリューションです。
所属していません StackOverflow