1

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

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の可能性があるPropertyです。

私の問題:

  • オブジェクトのリスト[]を渡すのは不快で、あまりOOフレンドリーではありません。
  • PropertyDefinitionが保持するプロパティのリストは会社に限定されていないため、私はPropertyDefinitionを保持することはできません。
  • PropertyDefinitionと場合によってはnullプロパティへの参照を保持する単純なオブジェクトを作成できますが、リスト全体を反復処理してそれぞれをこの新しいオブジェクトに配置するのは非効率的です。

より良いクエリまたはより良いマッピング構造についての提案がありますか?助けていただければ幸いです。

4

1 に答える 1

0

通常、コレクションの左結合は、コレクションが取り込まれたコンテナ オブジェクトのリストを返すfetchを介して処理するのが最適です。ただし、with条件を使用しているため、それは機能しません。

PropertyDefinition適切な public コンストラクターを使用して単純なホルダーを作成する場合Property、Hibernate にそれを返すように指示できます。

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

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

于 2009-09-10T22:33:16.277 に答える