Java EclipseLink:从基本实体中选择,并按InheritanceType.JOINED的子字段进行筛选
我有以下设置Java EclipseLink:从基本实体中选择,并按InheritanceType.JOINED的子字段进行筛选,java,jpa,eclipselink,Java,Jpa,Eclipselink,我有以下设置 @Entity @Table(name = "FOO") @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "FOO_TYPE", discriminatorType = DiscriminatorType.STRING, length = 20) @DiscriminatorValue("FOO") public class Foo implements Serializ
@Entity
@Table(name = "FOO")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "FOO_TYPE", discriminatorType = DiscriminatorType.STRING, length = 20)
@DiscriminatorValue("FOO")
public class Foo implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "foo_column")
private String fooColumn;
... getters and setters ...
}
@Entity
@Table(name = "BAR")
@PrimaryKeyJoinColumn(name = "BAR_ID", referencedColumnName = "ID")
@DiscriminatorValue("Bar")
public class Bar extends Foo {
@Column(name = "bar_column")
private String barColumn;
... getters and setters ...
}
当我以JPA提供者的身份在Hibernate 3.6中执行以下查询时,一切都按预期进行(至少……正如我预期的那样),结果列表中填充了扩展Foo类的各种对象:
List<Foo> fooList = em.createQuery("SELECT foo FROM Foo foo WHERE 1=1 AND foo.fooColumn = 'foo' and foo.barColumn = 'bar'");
注意:我已经阅读了EclipseLink的文档,并专门在表中添加了@DiscriminatorColumn和@DiscriminatorValue
然后,我使用TREAT函数将查询更改为以下内容:
List<Foo> fooList = em.createQuery("SELECT foo FROM Foo foo WHERE 1=1 AND foo.fooColumn = 'foo' and treat(foo as Bar).barColumn = 'bar'");
List-doulist=em.createQuery(“从foo-foo中选择foo,其中1=1,foo.fooColumn='foo'并处理(foo为Bar.barColumn='Bar');
现在可以使用了(根据JPA2.1)
是否可以在不借助JPA 2.1功能的情况下对子实体进行过滤?是的,您只需查询子实体而不是父实体。您可以使用TREAT功能进行测试吗?类似于:
SELECT b.name,b.ISBN FROM Order o JOIN TREAT(o.product AS Book)b
List<Foo> fooList = em.createQuery("SELECT foo FROM Foo foo WHERE 1=1 AND foo.fooColumn = 'foo' and treat(foo as Bar).barColumn = 'bar'");