当前位置: 首页 > 知识库问答 >
问题:

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

嵇昱
2023-03-14

我试图表示项目之间的父/子关系,这些项目只在一个特殊的item_type列中通过一个值(值为:无,父母,孩子)有所不同,父母和孩子有相同的元article_id。我想为所有项目重用相同的表和实体,因为父/子/无项目之间的字段没有区别。我想要hibernate做的sql并返回为List是这样的:

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,
);

问题是我似乎找不到一种方法来获取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;

孩子的视图或其他表格不是选项。需要一个单表解决方案。

我希望我的问题是明确的,并提前感谢。

共有2个答案

栾鸣
2023-03-14

对于每个遇到这个问题的人,我发现我的答案如下:

Hibernate自连接注释一对多映射示例

冬眠:自我加入困惑?

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

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

@OneToMany(mappedBy = "parent")
private List<item> child;
严柏
2023-03-14

你要找的正是单表继承策略。

您需要将您的超级类和子类都定义为实体,在超级类中使用@歧视性列来定义与实体类相关的列,在子类中使用@歧视性值来定义每个实体的属性值。

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

 类似资料:
  • 我用lombook注释了实体类(https://projectlombok.org/features/all): 我有使用这个实体从数据库中给我数据的服务。最后我尝试从会员对象中获取一些数据 但我在成员对象中没有任何getter。当我写我有错误(IDEA建议我创建getter'getName()')。如何将lombook与jpa实体一起使用?如何访问用lombok注释(如@Getter或@Sett

  • 最近,我在使用标准应用编程接口时遇到了问题。这是我第一次接触它。这是我的办公室实体的一部分。 目标-从特定的办公室实体获取工人实体列表。到目前为止,我已经知道如何通过以下方式实现目标: 它工作得很好,但我认为我太依赖JavaList接口方法而不是CriteriaAPI。我可以通过在Criteria中创建适当的查询来获取WorkerEntity(OfficeEntity中的字段“workers”)列

  • 问题内容: 但是,首选解决方案(属性访问)在我的情况下不起作用(我缺少列异常-为什么?) 该模型如下所示:实体和。表含有列是的表,以便它是典型的关系。 现在的问题是,如果我取的实体,我需要有机会获得价值(亦称的实体),而不取实体。我怎样才能做到这一点? 我使用的映射如下所示: 我想做的是调用而无需从DB中额外获取实体。 根据我上面提到的答案,如果我将注释从字段移到getter(在实体上,我对吗?)

  • //获取和设置 以下是我给用户的POJO:

  • 问题内容: 假设我有一个模块: 我想测试模块并检查它是否在没有类和字段但直接从注入器获取值的带注释的字段中注入正确的值: 问题答案:

  • 我有一个类CustomerProfile,它映射到一个表CUST_PROFILE。我们需要在一个单独的表中维护关闭的概要文件,该表将具有相同的模式。我在SO中读过很多问题,特别是下面的问题(下面有一个总结了很多类似问题的答案) 每个实体Hibernate两个表 从中我可以理解,使用MappedSuperclass以外的注释很难获得相同的结果。但可以使用xml映射。 我之所以不愿使用Mappedsu