Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EclipseLink:从基本实体中选择,并按InheritanceType.JOINED的子字段进行筛选_Java_Jpa_Eclipselink - Fatal编程技术网

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'");