1

我需要进行一个外部连接查询,以检索与某个公司相关联的所有定义以及与它们相关联的任何属性。

我有两个 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(永远不应为空),而 [1] 是可能为空的属性。

我的问题:

  • 传递对象 [] 列表令人讨厌且对 OO 不太友好。
  • 我不能只保留 PropertyDefinition,因为它拥有的属性列表不仅限于公司。
  • 我可以创建一个简单的对象,该对象包含对 PropertyDefinition 的引用和一个可能为 null 的属性,但是必须遍历整个 List 并将每个对象放入这个新对象中是低效的。

有人对更好的查询或更好的映射结构有建议吗?我真的很感激任何帮助。

4

1 回答 1

0

好吧,通常集合上的左连接最好通过fetch处理,它返回一个包含填充集合的容器对象列表。但是,由于您使用的是with条件,这对您不起作用。

如果您要为PropertyDefinitionProperty使用适当的公共构造函数创建一个简单的持有者,您可以告诉 Hibernate 返回它:

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

It should take care of the issues you've listed; it's not ideal but probably is the best solution available under the circumstances.

于 2009-09-10T22:33:16.277 回答