我有一个数据库结构,遗憾的是我无法控制。我正在尝试编写一个jpql查询来查询使用父实体的值列表,但它没有返回任何值。
类
这个类可能是问题的根源,它有一个TagUsage集合,所有子节点都应该作为集合,但数据库正在为所有继承类型创建一个单独的连接表。这是因为TABLE_PER_CLASS吗?
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Organization extends DomainEntity implements Serializable {
@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
private List<TagUsage> tagUsages = new ArrayList<TagUsage>();
public Organization() {
}
...
@Entity
@Table(name = "tag_usage", indexes = {
@Index(columnList = "id"),
@Index(columnList = "name")
})
public class TagUsage extends DomainEntity implements Serializable {
@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name = "tagbag_id", referencedColumnName = "id")
private TagBag tagBag;
@ManyToMany(mappedBy = "tagUsages")
private List<Organization> organizations;
...
我正在尝试运行命名查询“TagBag.findWithOrganizations”,但是当我这样做时,不会返回任何结果。
@Entity
@Table(name = "tag_bag", indexes = {
@Index(columnList = "id")})
@NamedQueries({
@NamedQuery(name = "TagBag.findWithOrganizations", query = "SELECT t from TagBag t LEFT JOIN FETCH t.tagUsages u LEFT JOIN FETCH u.organizations o where t.id = :id")})
public class TagBag extends DomainEntity implements Serializable {
@OneToMany(targetEntity = TagUsage.class, mappedBy = "tagBag", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<TagUsage> tagUsages;
有多个类可以扩展Organization类。我试图弄清楚我是否甚至可以编写一个查询来获取所有继承类型的组织TagBag.findWithOrganizations。
BTW我的问题归结为此,当查询尝试从TagUsage类获取组织时,它正在查询organization_tag_usage连接表,而不是下降到所有继承的类型以查询自己的* _tag_usage表。
如果这有任何不同,我们也在使用eclipselink。
更新
我已经诊断出这个问题,但我不确定为什么会这样。查看sql输出,我看到当我尝试获取附加到每个标记用法的组织时,它使用错误的连接表进行查询。
以下是每个继承对象的一个示例 组织。在这种情况下,有一个名为OrgSystem的类 继承自Organizaiton类。数据库有一个连接表 为组织的所有继承表创建的标记用法 以及Organization类本身的连接表。每当一个 TagUsage被添加到继承自Organization的类中 关系表示在类连接表中。例如在 在这种情况下,OrgSystem有一个名为orgsystem_tag_usages的表。但 当jpa(eclipselink)尝试获取关系时,它始终是 使用organization_tag_usages表加入。
SELECT t1.id, t1.DESCRIPTION, t1.NAME, t1.VID FROM ORGANIZATION_tag_usage t0, ORGSYSTEM t1 WHERE ((t0.tagUsages_id = ?) AND (t1.id = t0.organizations_id))
bind => [38]
组织表列表的Postgres输出。
\dt
| public | organization | table | |
| public | organization_tag_usage | table | |
| public | orgcustomer | table | |
| public | orgcustomer_tag_usage | table | |
| public | orgdevice | table | |
| public | orgdevice_tag_usage | table | |
| public | orgmasteragent | table | |
| public | orgmasteragent_tag_usage | table | |
| public | orgsite | table | |
| public | orgsite_tag_usage | table | |
| public | orgsystem | table | |
| public | orgsystem_tag_usage | table | |
正如您在此处所见,organization_tag_usage完全为空,但查询应使用的实际连接表是orgsystem_tag_usage。
select * from organization_tag_usage;
SELECT 0
select * from orgsystem_tag_usage
+----------------+----------------+
| orgsystem_id | tagusages_id |
|----------------+----------------|
| 1 | 10 |
| 1 | 16 |
| 1 | 17 |
| 1 | 18 |
| 3 | 19 |
| 3 | 20 |
| 2 | 23 |
| 1 | 25 |
| 1 | 26 |
| 1 | 27 |
| 2 | 30 |
| 1 | 38 |
| 1 | 39 |
| 1 | 52 |
| 3 | 53 |
| 3 | 54 |
+----------------+----------------+
SELECT 16
这是eclipselink中的错误吗?