是否可以仅使用 JPA/Hibernate-Annotation 从数据库中检索选定的子项列表?

问题描述

猜猜这可能是一件困难的事情。嗯,至少对我来说。我需要一些有关 JPA/Hibernate-Annotations 的帮助,我想知道是否有办法解决我的问题。不幸的是,我自己的技能似乎太有限,无法自己解决这个问题。这就是为什么我希望在这里找到任何可能对 jpa 注释和关系数据库(此处:oracle)有深入了解的人。

任务

我有三个表(见附图!请不要更改这部分,因为这些表不应该被创建!它们已经以这些名称存在,不能更改,主键+外键部分只是提供有关我在此处作为图像上传的这些现有表格的更多信息!谢谢。):

CONSTANT (PRIMARY KEY CONSTANT(ID) + FOREIGN KEY (PARENT_CONSTANT_ID) REFERENCES CONSTANT(ID)),COUNTRY (PRIMARY KEY COUNTRY(ID)),COUNTRY_TO_CONSTANT (PRIMARY KEY COUNTRY_TO_CONSTANT(COUNTRY_ID,CONSTANT_ID))

如下所示:Tables-Image

Java-Beans 看起来像这样:

常量.java

@Id
@Column(name = "ID")
private Integer id;

@Basic
@Column(name = "CODE")
private String code;

@Basic
@Column(name = "SORT_KEY")
private int sortKey;

@ManyToOne
@JoinColumn(name = "CONSTANT_TYPE_ID",referencedColumnName = "ID")
private ConstantType constantType;

@ManyToOne
@JoinColumn(name = "parent_constant_id",referencedColumnName = "ID")
private Constant parent;

@OnetoMany(mappedBy = "parent",targetEntity = Constant.class)
private List children;

...
    
public Collection<Constant> getChildren() {
    return children;
}

CountryToConstant.java

@Id
@Basic
@Column( name = "COUNTRY_ID" )
private Integer countryID;

@Id
@Basic
@Column( name = "CONSTANT_ID" )
private Integer constantID;

国家.java

@Id
@Column( name = "ID" )
@SequenceGenerator( name = "CountrySequence",sequenceName = "COUNTRY_ID_SEQ" )
@GeneratedValue( generator = "CountrySequence" )
private Integer id;
    
@Basic
@Column( name = "CODE" )
private String code;
    
@Basic
@Column( name = "NAME" )
private String name;
    
@Basic
@Column( name = "LANGUAGE_CODES" )
private String languageCodes;

为了简洁,我省略了所有 getter + setter,除了 'children' 属性的 constant.java-getter,因为这是这个问题唯一需要的 getter。更困难的是:上面显示的 java-beans 的结构可能不会改变,但允许扩展。这是因为没有破坏已经存在的(非常复杂的)程序结构。

private List children (Constant.java) 由属性 private Constant parent 映射。让我们假设通过其他程序逻辑,这里使用具有“父”常量 ID(例如 id = {11,12})的列表来迭代并一个一个地移交以创建 1 个父对象。因此,这将创建一个一个 private List children。因此,由于迭代,示例的结果将是 2 个单独的子列表:

  1. parent-id 11 -> children-id-list: {111,112,113,114,115,116}
  2. id 12 -> id-list: {121,122,123}) 对于每个父对象。

我需要得到的是与 COUNTRY_TO_CONSTANT 表对应的特定列表,只能通过使用注释。例如:如果此人在德国使用浏览器,则语言环境设置为 de_DE 导致 COUNTRY.id '1001'。并且(仅)基于国家/地区代码(而不是语言环境),上面迭代示例 (CONSTANT.id = {11,12}) 的结果应该是这两个列表:

  1. parent-id 11 -> children-id-list: {111,113}(去掉常量id 114、115和116)
  2. parent-id 12 -> children-id-list:{121}(省略常量 ID 122 和 123)

想法是,根据国家代码和放在表 CONSTANT.ID 中的 COUNTRY_TO_CONSTANT,每个列表都是根据相关数据库条目单独创建的。

由于 private List children 的定义不能改变,我需要的是第二个属性(例如 private List children2),它与 private List children 完全一样,唯一的区别是只有国家相关的孩子(见 COUNTRY_TO_CONSTANT 表)应由 private Constant parent 映射。

我在考虑类似的事情:

@OnetoMany(mappedBy = "parent",targetEntity = Constant.class)
//Any annotation to get what I need.
private List children2

或者也许:

@ManyToMany(mappedBy = "children",targetEntity = Constant.class)
//Any annotation to get what I need.
private Set children2

这甚至可以通过使用注释来实现吗?

希望,到目前为止,事情已经解释清楚了。如果没有,我可以在这里使用什么样的解决方法?如果缺少任何信息,请告诉我。

非常感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)