Inheritance JPA中单_表策略的继承和getter中的@Discriminator
使用单表策略的JPA实体中存在继承问题。在getters@Discriminator中,减少继承范围 我的结构如下:Inheritance JPA中单_表策略的继承和getter中的@Discriminator,inheritance,jpa,entity,getter,discriminator,Inheritance,Jpa,Entity,Getter,Discriminator,使用单表策略的JPA实体中存在继承问题。在getters@Discriminator中,减少继承范围 我的结构如下: @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="type") @DiscriminatorValue("A") class A { ... } @Entity @DiscriminatorValue("B") class B extends A { ..
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type")
@DiscriminatorValue("A")
class A {
...
}
@Entity
@DiscriminatorValue("B")
class B extends A {
...
}
@Entity
@DiscriminatorValue("C")
class C extends B {
...
}
@Entity
class Something{
@ManyToMany // blah blah
private List<B> listB; // getters and setters
}
问题是这个getter(Something.getListB)只将这个列表减少到类B(通过鉴别器B)。这导致对象类C不在列表中。它是由@Discriminator通过指示严格类型“t1.type=B”引起的。它不允许在那里放置像“t1.type IN(B,C)”这样的集合/列表
自定义JPQL查询以不同的方式构造:
SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name, t1.shortName
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id
WHERE t0.news = ? AND t1.type IN (?, ?)
[params=(long) 205, (String) B, (String) C]
他们应该怎么做就怎么做。但是盖特呢
有趣的是,当我将某个类从B类更改为A类(基本类)时:
@实体
分类{
@很多//诸如此类
私有列表listA;//getter和setter
}
这就解决了问题。在查询中的getter中:
SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name, t1.shortName
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id
WHERE t0.news = ?
[params=(long) 205]
“和t1.type=?”不相似。它可以工作,但会干扰从“真实世界对象”到“ORM实体”的映射。解决方案改变了,使抽象变得更糟。这不是一个优雅的解决方案
问题:
我怎样才能解决这个问题
我可以在getter中使用自定义JPQL查询吗
如何强制getter获取B和C对象
您是否有其他建议,而不是将列表更改为列表???您使用的JPA提供商是什么?听起来像个虫子。这应该适用于EclipseLink。我们在2.1.0版中使用OpenJPA。您是否有与其他JPA提供商合作的经验?
SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name, t1.shortName
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id
WHERE t0.news = ? AND t1.type IN (?, ?)
[params=(long) 205, (String) B, (String) C]
SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name, t1.shortName
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id
WHERE t0.news = ?
[params=(long) 205]