基于两列

时间:2015-12-11 17:30:10

标签: java sql hibernate

我有一个ITEM表和一个ITEM_ASSOCIATION表。 ITEM_ASSOCIATION维护以某种方式相关的ITEM组,并包含以下列:item_id, group_id, type, value。一个示例可能是一篇用3种不同语言表示相同内容的文章:

id | item_id | group_id | type   | value
----------------------------------------
1    1234      1          'lang'   'en' 
2    2345      1          'lang'   'es'
3    3456      1          'lang'   'fr'

我有一个Item和ItemAssociation Java Hibernate实体,我希望Item类包含ItemAssociation对象的集合,这些对象属于Item所属的任何组。用于检索Item 1234的关联的示例SQL将是:

select * from ITEM_ASSOCIATION 
where group_id in (select group_id from ITEM_ASSOCIATION where item_id = 1234)

有没有办法用标准的Hibernate注释来表示? ITEM_ASSOCIATION表是全新的,因此如果需要,我可以更改架构/添加新表,以便更容易使用Hibernate。此外,如果这有任何不同,我们的数据库是Oracle。

1 个答案:

答案 0 :(得分:0)

物品实体

@Entity 
public class Item {
  @OneToMany(mappedBy = "item")
  private Set<ItemAssociation> associations;
}

ItemAssocation实体

@Entity
public class ItemAssociation {
  @EmbeddedId
  private ItemAssociationId id;
  @Column
  private String value;
  @JoinColumn(name = "itemId", insertable = false, updatable = false)
  private Item item;
  @JoinColumn(name = "groupId", insertable = false, updatable = false)
  private Group group;
}

ItemAssociationId主键嵌入

@Embeddable
public class ItemAssociationId implements Serializable {
  @Column(nullable = false, updatable = false)
  private Long itemId;
  @Column(nullable = false, updatable = false)
  private Long groupId;
  @Column(nullable = false, updatable = false)
  private String type;
}

然后,为了查询包含所有关联的项目,无论是哪个组:

  

SELECT i FROM Item i JOIN FETCH ItemAssociation WHERE i.itemId =?