JPAQuery(jpql)从抽象类到具体类的连接

时间:2017-02-17 13:25:08

标签: java hibernate jpa jpql

也许简单的问题:

abstract class Contact

class ContactOffice extends Contact

class ContactUser extends Contact

这是设置,现在我正在尝试搜索特定的办公室名称。

new JPAQuery().from(recipient).innerJoin(recipient.recipient(),QContact.contact)

现在我需要在Contact和ContactOffice之间建立链接。

我试过了:

.innerJoin(recipient.recipient(),QContactOffice.contactOffice._super)

但是这给出了这个输出:

  inner join treat(notaRecipient.recipient as ContactOffice) as contactOffice

他抱怨(

任何建议都会感激不尽。

1 个答案:

答案 0 :(得分:0)

显然这个问题似乎还有点未开发或未实现。

我选择的解决方案是在存储库中进行本机查询 优点是我可以控制完整的查询,通常这是最快的方式,因为我也可以跳过T_CONTACT并直接转到T_CONTACT_USER和T_CONTACT_OFFICE,因为id是唯一的。

编辑:

虽然我第一次得到了一些好的结果,但我遇到了in子句的问题,因为这个本机查询实际上是一个子查询,可以返回超过2000个对象,而DB驱动程序不允许这样做。 / p>

但也有好消息

我让JpaSubQuery工作,你需要创建路径,否则你不能使用BooleanBuilder查询我的示例。

new JPASubQuery().from(recipient)
                    .innerJoin(recipient.nota(), QNota.nota)
                    .leftJoin(recipient.recipient().as(QContactUser.class).user(), QLightUser.lightUser)
                    .leftJoin(recipient.recipient().as(QContactOffice.class).office(), QOffice.office)
                    .leftJoin(recipient.recipient().as(QContactExternal.class).external(), QExternal.external)
                    .where(predicateBuilder).distinct()
                    .list(recipient.nota())));

正如您所看到的,我可以使链接正确,这就是我搜索的方式:

predicateBuilder.and(recipient.recipient().as(QContactUser.class).user().firstName.containsIgnoreCase(query.getToUser())
                        .or(recipient.recipient().as(QContactUser.class).user().lastName.containsIgnoreCase(query.getToUser())));

因为现在完整的查询将转到数据库,我不必担心2000限制,只有性能问题 但是,如果您需要将抽象类或接口与实现相关联,那么就可以这样做。