Java 如何使用hibernate注释从与Listfield相同的实体中获取子集

Java 如何使用hibernate注释从与Listfield相同的实体中获取子集,java,hibernate,jpa,orm,single-table-inheritance,Java,Hibernate,Jpa,Orm,Single Table Inheritance,我试图表示项目之间的父/子关系,这些项目在一个特殊的项目类型列中只有一个值不同(值为:NONE,parent,child),父项目和子项目具有相同的“meta”article\u id。 我希望对所有项目重复使用相同的表和实体,因为父/子/无项目之间的字段没有差异。 我希望hibernate执行并返回为列表的sql如下: SELECT * FROM item i1 JOIN item i2 ON i1.article_id = i2.article_id WHERE i1.item_typ

我试图表示项目之间的父/子关系,这些项目在一个特殊的项目类型列中只有一个值不同(值为:NONE,parent,child),父项目和子项目具有相同的“meta”article\u id。 我希望对所有项目重复使用相同的表和实体,因为父/子/无项目之间的字段没有差异。 我希望hibernate执行并返回为列表的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;
}
和数据库表:

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,
);
问题是我似乎找不到一种方法来获取hibernate中的where条件
i1.item\u 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;
@JoinTable(
name=“item”,
连接柱={
@JoinColumn(name=“article\u id”,referencedColumnName=“article\u id”),
@JoinColumn(name=“user\u service\u id”,referencedColumnName=“user\u service\u id”)
}
)
@WhereJoinTable(子句=“item_type=‘CHILD’”)
@其中(子句=“项目类型=‘父项’)
私人名单儿童;
孩子的视图或其他表格不是选项。需要一个单表解决方案


我希望我的问题是清楚的,并提前感谢您。

您正在寻找的正是单表继承策略

您需要将超类和子类都定义为实体,在超类中使用@DiscriminatorColumn定义将与实体类相关的列,在子类中使用@DiscriminatorValue定义每个实体的DescriminatorColumn的值


有关更多详细信息,请参阅此

对于遇到此问题的所有人,我在以下链接中找到了我的答案:

基本上,答案是每个子条目中的父项都需要一个uniqe id,然后连接子项和父项,如下所示:

@ManyToOne(cascade={CascadeType.ALL})    
@JoinColumn(name = "parent_item_id")
private Item parent;

@OneToMany(mappedBy = "parent")
private List<item> child;
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name=“父项\u id”)
私人物品父母;
@OneToMany(mappedBy=“家长”)
私人名单儿童;

这是正确的,但是如果我实现单表继承策略,如果我理解正确,我必须创建3个空子类来设置none、parent和child鉴别器值?例如,如何获取基本项实体中“我的列表”字段以外的所有子类?不,您不需要创建任何其他emtpy子类,请参考我在回答您之前引用的链接,但我认为我们彼此理解错误。引用您的话:“在超级类中,使用鉴别器列定义与实体类相关的列;在子类中,使用鉴别器值定义每个实体的描述符列的值“问题是,我的项目没有类层次结构,因为父项和子项具有完全相同的字段。我的问题是,这甚至可以通过hibernate实现,不需要额外的实体和表,只需要实体中的注释
@ManyToOne(cascade={CascadeType.ALL})    
@JoinColumn(name = "parent_item_id")
private Item parent;

@OneToMany(mappedBy = "parent")
private List<item> child;