質問

すべての定義と、特定の会社に関連付けられている定義が関連付けられているすべてのプロパティを取得する外部結合クエリを作成する必要があります。

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

リストにある問題を処理する必要があります。理想的ではありませんが、おそらくその状況下で利用可能な最良のソリューションです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top