带有两个左连接的JPA查询

时间:2016-06-09 14:33:27

标签: java jpa inheritance left-join

我有三个类:A.java,B.java和C.java。 A和B扩展C.如何编写JPA查询以正常工作?我试过了

Query query = em.createQuery("select c from C c left join A a left join B b where (c.id = a.id or c.id = b.id)");

1 个答案:

答案 0 :(得分:1)

简短的回答是你没有。在JPA:

  

如果未在实体层次结构的根类上指定@Inheritance注释,则使用默认策略InheritanceType.SINGLE_TABLE

当您从表C中选择所有内容时,JPA提供程序将基于discriminator column实例化类,所以

List<C> rl = em.createQuery("select c from C c", C.class).getResultList();
System.out.println(rl);

会给你:

Hibernate: select c0_.id as id2_0_, c0_.DTYPE as DTYPE1_0_ from C c0
[model.C@2cac4385, model.A@6731787b, model.B@16f7b4af]

如果需要,可以使用Java中的instanceof运算符来确定结果类型。如果你想要一个特定的子类,那么只需查询它:

List<A> rl = em.createQuery("select a from A a", A.class).getResultList();
System.out.println(rl);

会给你:

Hibernate: select a0_.id as id2_0_ from C a0_ where a0_.DTYPE='A'
[model.A@3fc9dfc5]

参考:Entity Inheritance