【发布时间】:2017-10-23 07:10:47
【问题描述】:
我试图通过特殊 item_type 列中的单个值(值:NONE,PARENT,CHILD)表示项目之间的父/子关系,父母和孩子具有相同的“元”article_id . 我想为所有项目重用相同的表和实体,因为父/子/无项目之间的字段没有区别。 我希望休眠执行并以 List 形式返回的 sql 是这样的:
SELECT *
FROM item i1
JOIN item i2 ON i1.article_id = i2.article_id
WHERE i1.item_type = 'PARENT' AND i2.item_type = 'CHILD';
这是我的实体:
@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "item", schema = "public", catalog = "item_db")
@DynamicUpdate
public class Item extends BaseDatesEntity {
@Id
@SequenceGenerator(name="item_id_seq", sequenceName = "item_id_seq", allocationSize = 5)
@GeneratedValue(strategy = SEQUENCE, generator = "item_id_seq")
@Column(name = "id", insertable = true, updatable = false, nullable = false, unique = true)
protected Long id;
@NotNull
@Column(name = "user_service_id", nullable = false, insertable = true, updatable = false)
private Long userServiceId;
@NotNull
@Column(name = "article_id", nullable = false, insertable = true, updatable = false)
private Long articleId;
@Size(min = 1, max = 100)
@Column(name = "title", nullable = false, insertable = true, updatable = true)
private String title;
@Column(name = "current_price", nullable = false, insertable = true, updatable = true)
private Integer currentPrice;
@Column(name = "shipping_costs", nullable = false, insertable = true, updatable = true)
private Integer shippingCosts;
@Min(0)
@Column(name = "quantity", nullable = false, insertable = true, updatable = true)
private Integer quantity;
@Column(name = "item_type", nullable = false, insertable = true, updatable = true)
private ItemType itemType;
@OneToMany(fetch = LAZY)
@JoinColumns({
@JoinColumn(name = "article_id", referencedColumnName = "article_id"),
@JoinColumn(name = "user_service_id", referencedColumnName = "user_service_id")
})
@Where(clause = "item_type = 'CHILD'")
private List<Item> childs;
}
这是一个枚举,它显示项目是父项还是子项还是没有子项的简单项:
@AllArgsConstructor(access = PRIVATE)
public enum ItemType {
NONE,
PARENT,
CHILD;
}
和数据库表:
CREATE TABLE item
(
id BIGINT DEFAULT nextval('item_id_seq'::regclass) PRIMARY KEY NOT NULL,
user_service_id BIGINT NOT NULL,
article_id BIGINT NOT NULL,
title VARCHAR(100) NOT NULL,
current_price INTEGER NOT NULL,
shipping_costs INTEGER NOT NULL,
quantity INTEGER NOT NULL,
item_type ITEM_TYPE DEFAULT 'NONE'::item_type NOT NULL,
);
问题是我似乎无法找到一种方法来在休眠状态下使用实体中的注释来获取条件i1.item_type = 'PARENT'。
另一种方法是将表与自身连接:
@JoinTable(
name="item",
joinColumns={
@JoinColumn(name = "article_id", referencedColumnName = "article_id"),
@JoinColumn(name = "user_service_id", referencedColumnName = "user_service_id")
}
)
@WhereJoinTable(clause = "item_type = 'CHILD'")
@Where(clause = "item_type = 'PARENT'")
private List<Item> childs;
孩子的视图或另一个表不是一个选项。需要单表解决方案。
我希望我的问题很清楚,并提前感谢。
【问题讨论】:
标签: java hibernate jpa orm single-table-inheritance